来自递归承诺的数组返回未定义

时间:2018-09-21 02:01:05

标签: javascript es6-promise indexeddb

我正在使用杰克·阿奇博尔德的indexedDB承诺wrapper

我有一个对象存储,其中包含json对象和一个单独的自动递增键。当我检索对象时,我还需要获取密钥,以便以后可以删除它们。

我正在使用iterateCursor递归地遍历游标,以便可以将键和值直接添加到数组中,并将其作为已解决的Promise返回。

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);
    });

}

但是我什么时候打电话

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

它抛出错误,表明返回的数组未定义。

1 个答案:

答案 0 :(得分:1)

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);
    });
}