【发布时间】:2018-09-21 02:01:05
【问题描述】:
我正在使用 Jake Archibald 的 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);
});
}
但是当我打电话时
DBHelper.getThings().then(returnedArray=> {
// do something with returnedArray
})
它抛出一个错误,说返回的数组是未定义的。
【问题讨论】:
-
函数
unsyncedStore.iterateCursor返回什么? -
阅读您链接到的页面上的文档表明(我不确定)可能而不是
return unsyncedStore.iterateCursor(cursor => {...您只是unsyncedStore.iterateCursor(cursor => {并在该块之后return unsyncedStore.complete;-或者return unsyncedStore.complete.then(() => keyVals); -
@JaromandaX 根据documentation,它是openCursor 的包装器,用于使用promise 迭代游标,它的工作方式相同,但需要一个回调来进行迭代而不是调用 .then()就可以了。
-
我所做的只是查看示例中的代码,似乎
unsyncedStore.complete是一个承诺,它会在迭代完成时解决 - 当然,然后你'我想返回你建立的数组,因此.then(() => keyVals)所以返回的承诺解析为keyVals- 文档没有提到iterateCursor实际返回的内容,如果它返回未定义,那就是问题跨度> -
@JaromandaX 我的理解是 tx.complete 只是返回一个基于交易成功解决/拒绝的承诺,如果您的操作实际上返回了一些东西,您只需返回该承诺
标签: javascript es6-promise indexeddb