私のサービスワーカーには、フェッチイベントが発生したときに、最初にブール値(event.request.urlではない)を含むエンドポイントをフェッチし、値をチェックするというロジックがあります。キャッシュからの応答を提供している現在のフェッチ イベント。しかし、次のエラーが発生しています。
Uncaught (in promise) DOMException: Failed to execute 'respondWith' on 'FetchEvent': The fetch event has already been Respond to
ここで、 m_stateがInitialと等しくない場合にこのエラーがスローされることを確認しました
if (m_state != Initial) {
exceptionState.throwDOMException(InvalidStateError, "The fetch event has already been responded to.");
return;
}
追加のフェッチ イベントが何らかの形で前のフェッチ イベントを消費しているので、m_state 変数を変更しているのではないかと疑っていますが、イベントの URL をフェッチしていません。それに対する解決策。しかし、なぜそれは言っているのですか
以下にコード スニペットを貼り付けます。
function fetchEvt(event) {
check().then(function (status) {
if (status === 0) {
handleRequest(event);
}
});
}
function checkHash() {
return new Promise(function (resolve) {
fetch(endpoint, { credentials: 'include' }).then(function (response) {
return response.text();
}).then(function (text) {
resolve(text);
});
}
}
function handleRequest(event) {
event.respondWith(caches.match(event.request.url).then(function (Response) {
if (Response) {
return Response;
}
return fetch(event.reuqest);
}));
}
event.respondWith部分がエラーをスローしています。この問題を解決する方法を提案してください。
編集 :
function handleRequest(event) {
event.respondWith(checkHash().then(function (status) {
if (status === true) {
caches.match(event.request.url).then(function (Response) {
if (Response) {
return Response;
}
return fetch(event.reuqest);
});
} else if (status === false) return fetch(event.reuqest);
}));