我使用localforage库访问localStorage / IndexedDB。要检索项目,将调用localforage.getItem()函数,该函数返回在检索数据时满足的Promise。
我需要遍历localforage键,调用' getItem'在任何符合我标准的密钥上,并将该密钥的值放在'匹配'阵列。但是,我不想继续使用该功能,直到我确定所有已成功将值添加到“匹配”中。
我对Promises很陌生,在我继续前行之前,我无法弄清楚如何等待所有的getItem()Promise完成。
我意识到localforage有一个'迭代'功能,但我真的有兴趣变得更熟练使用Promise,并且真的想知道这应该如何工作。
这就是我正在做的事情:
var matches = []; // Array to store matched items
localforage.keys() // Get all keys in localforage
.then(function(keys) // When all keys are retrieved, iterate:
{
for(var i in keys)
{
// If the current key matches what I am looking for, add it to the 'matches' array.
if (keys[i].indexOf('something i am looking for') > -1)
{
// Here I need to add this value to my array 'matches', but this requires using the getItem method which returns a Promise and doesn't necessarily fulfill immediately.
localforage.getItem(keys[i])
.then(function(value)
{
matches.push(value);
});
}
}
});
// At this point, I want to proceed only after *all* matches have been added to the 'matches' array (i.e. the getItem() Promises are fulfilled on all items in the loop).
我该怎么做?这是等待'等待'表达式适用?例如,我应该
await localforage.getItem(keys[i])
.then(function(value)
... etc
这会使getItem函数同步吗?
感谢您的任何建议/指示。
答案 0 :(得分:3)
在这种情况下,您可以使用:value="name"
。基本的想法是你将一堆promises推入和数组然后将数组传递给Promise.all()
当数组中的所有promise解析时,Promise.all()
解析为值的数组:
Promise.all()
您也可以使用localforage.keys()
.then(function(keys){
var matches = []
for(let i in keys) {
if (keys[i].indexOf('something i am looking for') > -1) {
// matches will be an array of promises
matches.push(localforage.getItem(keys[i]))
}
}
// Promise.all returns a promise that resolves to an array
// of the values they resolve to
return Promise.all(matches)
})
.then(values => {
// values is an array of your items
})
对此进行此操作,并模拟async/await
和keys
以使代码段运行:
getItems