Javascript 未捕获的DomeException(承诺中)-serviceworker中特定于劫持的GraphQL请求

Javascript 未捕获的DomeException(承诺中)-serviceworker中特定于劫持的GraphQL请求,javascript,es6-promise,service-worker,fetch-api,Javascript,Es6 Promise,Service Worker,Fetch Api,我试图通过服务工作者劫持一个特定的GraphQL请求,以伪造来自IndexedDB中数据的响应,但我得到一个错误,该事件已经得到响应。抓取正在为缓存的文件工作,如果抓取的数据不在缓存中,它将使用网络。如果没有网络,将有脱机回退。我如何协调我的承诺,我也可以劫持对我的GraphQL API和特定查询操作名的请求,因为我似乎把async event.respondWith调用搞砸了 self.addEventListener('fetch', function (event) { if (e

我试图通过服务工作者劫持一个特定的GraphQL请求,以伪造来自IndexedDB中数据的响应,但我得到一个错误,该事件已经得到响应。抓取正在为缓存的文件工作,如果抓取的数据不在缓存中,它将使用网络。如果没有网络,将有脱机回退。我如何协调我的承诺,我也可以劫持对我的GraphQL API和特定查询操作名的请求,因为我似乎把async event.respondWith调用搞砸了

self.addEventListener('fetch', function (event) {
    if (event.request.url === __GRAPHQL_URL__) {
        event.request.clone().json().then(({operationName, variables}) => {
            switch (operationName) {
                case 'getOfflineFacilities':
                    //when a fetch is matching there will be the error
                    event.respondWith(serveOfflineFacilities());
            }
        });
    }else{

        event.respondWith(
            caches.match(event.request).then(function (response) {
                console.log("cache or network fallback");
                return response || fetch(event.request);
            }).catch(function () {
                console.log("offline fallback");
                return caches.match('/index.html');
            })
        );
    }
});
当有一个GraphQL查询命中_GraphQL_URL____)和我的操作名时出错


sw.js:41 promise DomeException中未捕获:未能在“FetchEvent”上执行“respondWith”:事件已被响应。

它的文档很少,但您需要在处理程序中立即调用。如果事件处理程序退出且respondWith未被调用,则请求将被删除,以便提供默认响应。这仅在事件处理程序调用期间设置-当您仅从承诺回调调用它时,您将得到事件已响应异常的消息

因此,您需要更改代码以将整个承诺传递给respondWith:


是唯一的获取事件侦听器吗?请注意,您从未处理event.request.clone.json promiseYes的失败。它是唯一一个event.respondWith在我的开关情况下无法访问的侦听器。你知道怎么解决这个问题吗?我上面代码中的那个。我的问题是,我的交换机案例中的所有内容都已得到响应
if (event.request.url === __GRAPHQL_URL__) {
    event.respondWith(event.request.clone().json().then(({operationName, variables}) => {
//  ^^^^^^^^^^^^^^^^^^
        switch (operationName) {
            case 'getOfflineFacilities':
                return serveOfflineFacilities();
//              ^^^^^^
        }
    }));
//    ^
}