有可能以某种方式与Promises运行同步循环吗?

时间:2016-04-15 11:17:46

标签: javascript node.js promise

所以我有一个简单的循环函数,它返回Promise。看起来像这样:

for (var i = 0; i < categories.length; i++) {
    parseCategory(categories[i]).then(function() {
        // now go to the next category
    })
}

是否有可能等到第一个函数结束并迭代到下一个元素?

P.S。 没有必要使用承诺。

3 个答案:

答案 0 :(得分:1)

如果你想在没有库的情况下在ES6中这样做:

var parseCategoryPromise = Promise.resolve();
for (var i = 0; i < categories.length; i++) {
  (function(i){
    parseCategoryPromise = parseCategoryPromise.then(function(){
      return parseCategory(categories[i])
    });
  })(i)
}

答案 1 :(得分:0)

如果你已经在使用Promises,为什么不一直走?最好的Promise模块Bluebird有一个辅助函数,专门设计用于迭代遍历数组,串行控制执行:http://bluebirdjs.com/docs/api/promise.mapseries.html。你这样使用它:

Promise.mapSeries(categories, function(category) {
    // Parse the category, and return a value or a promise.
});

如果parseCategory是在别处定义的函数,你甚至可以得到更简短的信息:

Promise.mapSeries(categories, parseCategory);

还有一个map姐妹函数可以并行执行调用。

答案 2 :(得分:0)

通过await / async支持,你可以很容易地做到这一点:

async function parseCategories (categories) {
  for (var i = 0; i < categories.length; i++) {
    await parseCategory(categories[i])
  }
}
相关问题