При попытке извлечь записи из хранилища IndexedDB в качестве асинхронного итератора, не найдя ни одного существующего рецепта, я пришел к этому коду, который, кажется, работает.
function itemPromise(req) {
return new Promise((resolve, reject) => {
req.onsuccess = (event) => {
let cursor = event.target.result;
resolve([cursor, itemPromise(req)]);
};
req.onerror = (event) => {
reject(event.target)
};
});
}
function iterRecords(req) {
let promise = itemPromise(req);
return {
async next() {
let [cursor, nextPromise] = await promise;
promise = nextPromise;
if (cursor) {
cursor.continue();
return Promise.resolve({done: false, value: cursor.value});
} else {
return Promise.resolve({done: true, value: null});
}
}
}
}
async function main() {
let db = await getDb('myDatabase'); // gets a promise on datbase
let trans = db.transaction(['myStore'], 'readonly');
let store = trans.objectStore('myStore');
let req = store.openCursor();
let iter = iterRecords(req);
while(true) {
let {done, value} = await iter.next();
if (done) {
break;
}
console.log(value);
}
}
Поскольку он немного сложен /Я не знаю, не упустил ли я что-то в моем подходе. Я хотел бы получить некоторые отзывы, прежде чем изобретать колесо ... или изобретать очень плохое колесо.
Примечание: мой код не использует async *function
или for await ... of
, поскольку они еще не поддерживаются всеми браузерами.