当尝试作为异步迭代器从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
,因为并非所有浏览器都支持它们。