如何在循环中使用Promise并确保在继续之前已经完成了所有内容?

时间:2018-04-25 16:44:57

标签: javascript loops promise es6-promise

我使用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函数同步吗?

感谢您的任何建议/指示。

1 个答案:

答案 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/awaitkeys以使代码段运行:



getItems