Массив из рекурсивных обещаний возвращает неопределенный - PullRequest
0 голосов
/ 21 сентября 2018

Я использую обещание indexedDB Джейка Арчибальда wrapper .

У меня есть хранилище объектов, которое содержит объекты json и отдельный ключ с автоматическим приращением.Когда я получаю объекты, мне также нужно получить ключ, чтобы потом я мог их удалить.

Я использую iterateCursor для рекурсивного пошагового перемещения курсора, чтобы я мог напрямую добавить ключ и значение в массив, который я возвращаю в качестве разрешенного обещания.

static getThings(){

    return thingsDb.then(db => {
        let keyVals = [];

        const tx = db.transaction('things');
        const unsyncedStore = tx.objectStore('things');

        return unsyncedStore.iterateCursor(cursor => {
            if(!cursor) return Promise.resolve(keyVals);
            console.log(`key: ${cursor.primaryKey}, val: ${cursor.value}`);
            keyVals.push({key: cursor.primaryKey, value: cursor.value});
            cursor.continue();
        });
    }).catch(error => {
        console.error(error);
    });

}

однако, когда яcall

DBHelper.getThings().then(returnedArray=> {
  // do something with returnedArray
})

выдает ошибку, говоря, что возвращаемый массив не определен.

1 Ответ

0 голосов
/ 21 сентября 2018

iterateCursor ничего не возвращает (т. Е. Возвращает неопределенное значение)

Вам необходимо вернуть promise, доступное по unsyncedStore.complete

Но это обещание не будет выполненополезное значение, поэтому используйте .then для возврата keyVals

Кроме того, нет смысла делать if(!cursor) return Promise.resolve(keyVals);, поскольку возвращаемое значение из обратного вызова iterateCursor игнорируется

static getThings() {
    return thingsDb.then(db => {
        let keyVals = [];

        const tx = db.transaction('things');
        const unsyncedStore = tx.objectStore('things');
        // no return here since iterateCursor doesn't return anything useful anyway   
        unsyncedStore.iterateCursor(cursor => {
            if (!cursor) return;
            console.log(`key: ${cursor.primaryKey}, val: ${cursor.value}`);
            keyVals.push({key: cursor.primaryKey, value: cursor.value});
            cursor.continue();
        });
        // return here - complete is a promise that resolves when the iterateCursor completes
        return unsyncedStore.complete.then(() => keyVals);
    }).catch(error => {
        console.error(error);
    });
}
...