Я столкнулся с той же ситуацией, когда это не пользовательский ответ, мне нужно перехватить вызов Http и посмотреть тот же URL в Indexed db, где я уже нажал URL и ответ и прочитал оттуда и дал в качестве ответа
В событии выборки работника службы я реализовал сетевой первый подход , который означает, что он сначала будет искать службу, если возникнет какая-либо ошибка, затем прочитает ее из индексированной базы данных и вернет ответ.
fetch (event.request). catch (function (result) {});
self.addEventListener('fetch', function (event) {
if (event.request.url.includes('[yourservicecallName]')) {
event.respondWith(
fetch(event.request).catch(function (result) {
return readtheDatafromIndexedDb('firstDB', 'firstStore', event.request.url).then(function(response)
{
return response;
});
})
);
}
});
метод для чтения из проиндексированногодБ и вернуть ответ
function readtheDatafromIndexedDb(dbName, storeName, key) {
return new Promise((resolve, reject) => {
var openRequest = indexedDB.open(dbName, 2);
openRequest.onupgradeneeded = function (e) {
let db = request.result;
if (!db.objectStore.contains(storeName)) {
db.createObjectStore(storeName, { autoIncrement: true });
}
}
openRequest.onsuccess = function (e) {
console.log("Success!");
db = e.target.result;
var transaction = db.transaction([storeName], "readwrite");
var store = transaction.objectStore(storeName);
var request = store.get(key);
request.onerror = function () {
console.log("Error");
reject("unexpected error happened");
}
request.onsuccess = function (e) {
console.log("return the respose from db");
//JSON.parse(request.result)
resolve(new Response( request.result, { headers: { 'content-type':'text/plain' } } ));
}
}
openRequest.onerror = function (e) {
console.log("Error");
console.dir(e);
}
});
}
надеюсь, это поможет вам.