В простом сервисном сервисе JavaScript я хочу перехватить запрос и прочитать значение из IndexedDB перед событием .respondWith
Но асинхронная природа IndexDB, похоже, не позволяет этого.
Поскольку indexedDB.open является асинхронным, мы должны его дождаться, и это нормально. Однако обратный вызов (onsuccess) происходит позже, поэтому функция завершается сразу после открытия при ожидании.
Единственный способ убедить его в надежной работе - добавить:
var wait = ms => new Promise((r, j) => setTimeout(r, ms));
await wait(50)
в конце моей функции readDB, чтобы заставить ждать, пока не завершится успешное выполнение.
Это совершенно глупо!
И, пожалуйста, даже не пытайтесь рассказать мне об обещаниях. Они НЕ РАБОТАЮТ в этих обстоятельствах.
Кто-нибудь знает, как мы должны использовать это правильно?
Пример readDB находится здесь (для ясности удалена вся проверка ошибок). Обратите внимание, что мы не можем использовать await внутри onsuccess, поэтому два внутренних вызова 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;
}