【发布时间】:2018-06-03 16:45:35
【问题描述】:
我正在使用 service-worker 来缓存一些静态文件,但我也在尝试将我的 json 数据缓存在 indexedDB 中。因此,每当我的应用程序访问 url “www.someurl.com/api/my-items”时,它都会被 service worker 拦截,而是使用我的 indexedDB 数据返回自定义响应。
我从这里使用基于 promise 的 idb https://github.com/jakearchibald/idb
到目前为止,我想出了以下代码。据我了解,我需要拦截 fetch 事件并返回自定义响应。
importScripts('idb.js');
var pageCache = 'v1';
var idbName = 'data';
var idbTableName = 'idbtable';
var cacheFiles = [
'../js/',
'../css/file1.css',
'../css/fle2.css'
];
//Install and Activate events
//...
//Fetch Event
self.addEventListener('fetch', (event) => {
var requestUrl = new URL(event.request.url);
if (requestUrl.origin !== location.origin) {
//...
if(event.request.url.endsWith('/api/my-items')){
event.respondWith(
idb.open(idbName, 1).then((db) => {
var tx = db.transaction([idbTableName], 'readonly');
var store = tx.objectStore(idbTableName);
return store.getAll();
}).then(function(items) {
return new Response(JSON.stringify(items), { "status" : 200 , "statusText" : "MyCustomResponse!" })
})
)
}
//...
}
})
我试图了解是否有更简洁的方法来编写此代码,而无需专门使用“new Response()”创建响应。我确信有一个我不完全理解的基于承诺的概念。
【问题讨论】:
-
嗨 Roman,您是否成功拦截并从 indexed-db 获取数据并作为响应返回。
-
@Aji Roman 并没有寻找从 IndexedDb 获取数据并作为响应返回的成功方法——他的代码已经成功地做到了这一点。他在问是否有一种更清洁的方式来做这件事,而不是专门创建一个响应。 IMO,没有 - 必须明确创建响应。但我愿意纠正!
标签: service-worker progressive-web-apps pwa