Javascript 通过缓存xor indexedDB响应获取请求

Javascript 通过缓存xor indexedDB响应获取请求,javascript,fetch,service-worker,indexeddb,cachestorage,Javascript,Fetch,Service Worker,Indexeddb,Cachestorage,我正试图让服务人员根据请求的类型响应获取事件。对于静态资源,我使用缓存: // TODO: make cache update when item found const _fetchOrCache = (cache, request) => { return cache.match(request).then(cacheResponse => { // found in cache if (cacheResponse) { return cache

我正试图让服务人员根据请求的类型响应获取事件。对于静态资源,我使用缓存:

// TODO: make cache update when item found
const _fetchOrCache = (cache, request) => {
  return cache.match(request).then(cacheResponse => {

    // found in cache
    if (cacheResponse) {
      return cacheResponse
    }

    // has to add to cache
    return fetch(request)
      .then(fetchResponse => {
        // needs cloning since a response works only once
        cache.put(request, fetchResponse.clone())
        return fetchResponse
      });
  }).catch(e => { console.error(e) })
}
对于api响应,我已经将IndexedDB与Jake Archibald的IndexedDB连接起来,并承诺返回如下内容:

const fetchAllItems = () => {
    return self.idbPromise
        .then(conn => conn.transaction(self.itemDB, 'readonly'))
        .then(tx => tx.objectStore(self.itemDB))
        .then(store => store.getAll())
        .then(storeContents => JSON.stringify(storeContents));
}
当我调用服务工作者中的所有内容时,缓存部分工作正常,但indexedDB失败,抛出了一个无法从api url获取的错误:

self.addEventListener("fetch", event => {

    // analyzes request url and constructs a resource object
    const resource = getResourceInfo(event.request.url);

    // handle all cachable requests
    if (resource.type == "other") {
        event.respondWith(
            caches.open(self.cache)
                .then(cache => _fetchOrCache(cache, event.request))
        );
    }

    // handle api requests
    if (resource.type == "api") {
        event.respondWith(
            new Response(fetchAllItems());
        );    
    }
});
我的问题如下:
1.)像这样分开存储获取请求有什么意义吗?

2.)如何使indexedDB部分正常工作?

使用基于Jake Archibalds promise的idb很好。有很多方法可以安装他的idb。最快的方法是在某处下载idb.js文件(这是库)。然后在服务人员列表的第一行导入它,如下所示:

    importScripts('./js/idb.js');

    .....

    //SW installation event
    self.addEventListener('install', function (event) {
        console.log("[ServiceWorker] Installed");
    });


    //SW Actication event (where we create the idb)
    self.addEventListener('activate', function(event) {
        console.log("[ServiceWorker] Activating");
        createIndexedDB();
    });


   .....

   //Intercept fetch events and save data in IDB

   .....


    //IndexedDB
    function createIndexedDB() {
      self.indexedDB = self.indexedDB || self.mozIndexedDB || self.webkitIndexedDB || self.msIndexedDB;

      if (!(self.indexedDB)) { console.console.log('IDB not supported'); return null;}

      return idb.open('mydb', 1, function(upgradeDb) {
        if (!upgradeDb.objectStoreNames.contains('items')) {
          upgradeDb.createObjectStore('items', {keyPath: 'id'});
        }
      });
    }
根据您在上面粘贴的用于检索IDB数据的代码判断,我不清楚IDB到底是什么。。。您确定已声明此变量吗

你应该有这样的东西

importScripts('./js/idb.js');

//...
//createIdb and store
//...

var idbPromise = idb.open('mydb');

//and after that you have your code like idbPromise.then().then()...
因此,您可以在软件激活期间创建IDB和表。然后截取fetch事件并开始使用indexeddb,就像您在教程中看到的那样


祝你好运

谢谢你的回答,我应该包括代码本身已经导入并连接好了。这是我遇到问题的获取部分。将更新问题。