我必须为数组中的每个项目调用一些异步任务的承诺,但我想连续执行这些任务。
Promise.all仅用于拥有一个新的promise,它可以合并一个promise列表,但不会按顺序调用它们。
如何使用标准的promise api来实现这一点,而不需要Q,bluebird等第三方库。
答案 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()