IndexedDB записывает как асинхронный итератор - PullRequest
2 голосов
/ 14 октября 2019

При попытке извлечь записи из хранилища 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, поскольку они еще не поддерживаются всеми браузерами.

...