Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Serviceworker Bug event.respondWith_Javascript_Service Worker_Progressive Web Apps - Fatal编程技术网

Javascript Serviceworker Bug event.respondWith

Javascript Serviceworker Bug event.respondWith,javascript,service-worker,progressive-web-apps,Javascript,Service Worker,Progressive Web Apps,我的serviceworker的逻辑是,当发生提取事件时,它首先提取一个包含一些布尔值(不是event.request.url)的端点,并根据我为当前提取事件调用的值event.respondWith()检查该值,我从缓存中提供响应。但是我得到以下错误 未捕获(承诺中)DOMEException:未能在上执行“respondWith” “FetchEvent”:已响应fetch事件 我检查了当m_state不等于Initial if (m_state != Initial) { exce

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

未捕获(承诺中)DOMEException:未能在上执行“respondWith” “FetchEvent”:已响应fetch事件

我检查了当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);
    }));
}
事件。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);
}));

处理
fetch
事件时,需要调用
event.respondWith
同步。如果您不这样做,浏览器会假定它应该继续处理请求。这就是为什么当您开始在代码中调用
respondWith
时,请求已经被处理,并且您看到fetch事件已经响应到异常

换句话说:试着在
handleRequest
的内部调用你的
checkHash
,而不是相反的方式。

Re“因为我有一个额外的获取事件,它正在消耗上一个获取事件”,这应该不是问题;您可以从
fetch
事件处理程序中执行
fetch()
,事情会很顺利:

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

我不太明白您试图用代码实现什么,但是多次获取,第一次影响第二次的行为,效果很好。

内部句柄请求或事件。respondWith我试图将其移动到事件内部。respondWith,现在它是说导致了网络错误响应:一个不是响应的对象被传递到respondWith(),您在两个地方将请求拼写为reuqest。是的,但即使在修复了相同的错误之后,如果事件内部有另一次提取,respondWith会抛出此错误。这将导致多次提取,并且看起来可能会出现问题。@GalBracha我不完全理解最初的问题,但似乎需要多次提取?你没有得到那种印象吗?