有没有可能以某种方式用Promises运行同步循环

Is it possible somehow run sync loop with Promises?

本文关键字:Promises 运行 同步 循环 方式用 有可能      更新时间:2023-09-26

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

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

是否可以以某种方式等待第一个函数结束并迭代到下一个元素?

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

如果您想在没有库的ES6中执行此操作:

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

如果您已经在使用Promises,为什么不一直使用呢?最好的Promise模块Bluebird有一个助手函数,专门设计用于在数组中串行迭代,Promise控制执行: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姐妹函数。

有了等待/异步支持,您就可以很容易地做到这一点:

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