8

我的 serviceworker 的逻辑是,当发生 fetch 事件时,首先它会获取一个包含一些布尔值(不是 event.request.url)的端点并根据我调用event.respondWith()的值检查该值当前 fetch 事件,我在其中提供来自缓存的响应。但是我收到以下错误,

未捕获(承诺中)DOMException:无法在“FetchEvent”上执行“respondWith”:获取事件已得到响应

在这里检查了当m_state不等于Initial时会抛出此错误

if (m_state != Initial) {
    exceptionState.throwDOMException(InvalidStateError, "The fetch event has already been responded to.");
    return;
}

我怀疑由于我有一个额外的 fetch 事件,它以某种方式消耗了以前的 fetch 事件,它正在更改 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 回答
0

重新“因为我有一个额外的 fetch 事件,它正在消耗以前的 fetch 事件”这应该不是问题;你可以fetch()fetch事件处理程序中,事情会正常工作:

self.addEventListener("fetch", e => {
  e.respondWith(
    fetch("https://fonts.googleapis.com/css?family=Open+Sans")
    .then(_ => fetch(e.request))
  );
});

我不太明白你想用你的代码实现什么,但是多次获取,第一次影响第二次的行为,工作正常。

于 2016-03-18T16:24:04.807 回答