我正在使用杰克·阿奇博尔德的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
})
它抛出错误,表明返回的数组未定义。
答案 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);
});
}