【发布时间】:2018-11-19 20:05:50
【问题描述】:
在一个简单的 JavaScript Service Worker 中,我想在 event.respondWith 之前拦截一个请求并从 IndexedDB 读取一个值
但 IndexDB 的异步特性似乎不允许这样做。
由于 indexedDB.open 是异步的,我们必须等待它,这很好。但是,回调(onsuccess)稍后发生,因此该函数将在等待打开后立即退出。
我发现让它可靠工作的唯一方法是添加:
var wait = ms => new Promise((r, j) => setTimeout(r, ms));
await wait(50)
在我的 readDB 函数结束时强制等待,直到 onsuccess 完成。
这完全是愚蠢的!
请不要试图告诉我有关承诺的事情。它们在这种情况下不起作用。
有人知道我们应该如何正确使用它吗?
这里有示例 readDB(为清楚起见,删除了所有错误检查)。请注意,我们不能在 onsuccess 中使用 await,因此不会等待两个内部 IndexedDB 调用!
async function readDB(dbname, storeName, id) {
var result;
var request = await indexedDB.open(dbname, 1); //indexedDB.open is an asynchronous function
request.onsuccess = function (event) {
let db = event.target.result;
var transaction = db.transaction([storeName], "readonly"); //This is also asynchronous and needs await
var store = transaction.objectStore(storeName);
var objectStoreRequest = store.get(id); //This is also asynchronous and needs await
objectStoreRequest.onsuccess = function (event) {
result = objectStoreRequest.result;
};
};
//Without this wait, this function returns BEFORE the onsuccess has completed
console.warn('ABOUT TO WAIT');
var wait = ms => new Promise((r, j) => setTimeout(r, ms));
await wait(50)
console.warn('WAIT DONE');
return result;
}
【问题讨论】:
标签: service-worker