IndexedDB记录作为异步迭代器

时间:2019-10-14 11:34:40

标签: javascript asynchronous iterator record indexeddb

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

0 个答案:

没有答案