在系列中执行本机js promise

时间:2015-05-25 20:24:32

标签: javascript node.js promise

我必须为数组中的每个项目调用一些异步任务的承诺,但我想连续执行这些任务。

Promise.all仅用于拥有一个新的promise,它可以合并一个promise列表,但不会按顺序调用它们。

如何使用标准的promise api来实现这一点,而不需要Q,bluebird等第三方库。

1 个答案:

答案 0 :(得分:20)

您使用.then()将promises链接到一个返回另一个promise的回调。所以,假设你有三个函数a,b和c都返回一个promise。你可以像这样链接它们(按顺序执行):

a().then(b).then(c).then(function(result) {
   // all are done here
});

如果您正在处理一个数组并且您想要为数组中的每个项调用一个promise-returns函数myFunc,那么可以使用标准设计模式来实现数组和承诺{{1}如下所示,一次遍历数组一个项目:

.reduce()

事实证明,这实际上只是在第一个示例中链接了一堆var items = [...]; items.reduce(function(p, item) { return p.then(function() { return myFunc(item); }); }, Promise.resolve()); 处理程序,但是使用.then()的结构为您遍历数组。

从ES2017开始,您还可以使用async / await串行处理这样的数组:

.reduce()