8

私のサービスワーカーには、フェッチイベントが発生したときに、最初にブール値(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);
}));
4

2 に答える 2

6

イベントevent.respondWithを処理するときは、同期的に呼び出す必要があります。fetchそうしないと、ブラウザはリクエストの処理を続行する必要があると見なします。respondWithそのため、コードの呼び出しに取り掛かると、リクエストは既に処理されており、 fetch イベントが既に例外に応答されていることがわかります。

言い換えれば、その逆ではなく、あなたのcheckHash内側に電話してみてくださいhandleRequest.

于 2016-03-17T15:25:44.417 に答える