Я пытаюсь перехватить определенный GraphQL-запрос через сервисного работника, чтобы подделать ответ от данных в моей IndexedDB, но я получаю ошибку, на которую событие уже было получено ответом. Выборка работает для кэшированных файлов, если извлеченные данные не находятся в кэше, он будет использовать сеть. Если нет сети, будет автономный запасной вариант. Как я могу организовать свои Обещания, чтобы я также мог перехватывать запросы к моему API GraphQL и определенному запросу (operationName), потому что, кажется, я испортил вызовы 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 Uncaught (in promise) DOMException: Failed to execute 'respondWith' on 'FetchEvent': The event has already been responded to.