【发布时间】:2017-11-14 19:41:17
【问题描述】:
我正在通过以下方式减少一组嵌套的 Promise:
const promises = items.map((item, index) => {
console.log(index);
return doAsyncThing(item).then(() => {
console.log(index);
});
});
return promises.reduce((acc, p) => acc.then(() => p), Promise.resolve());
我希望打印出 console.log 条目
0 0 1 1 2 2
但他们正在打印出来
0 1 2 2 1 0
我怎样才能重组我的代码,以便在操作 1 之前完成整个操作 0,操作 1 在选项 2 之前完成,等等...?
【问题讨论】:
-
您只需在上一次通话结束后拨打
doAsyncThing()(在您的reduce中) -
i,... 不明白为什么在这里使用 reduce 而不是 promise.all,默认情况下会保留顺序。但是请注意,您正在记录的索引仍然会出现乱序,但 promise.all .then 回调中的结果将是有序的。
-
你需要清楚地思考你实际上在做什么。一旦你有一个需要解决的承诺,就不需要在该承诺上调用
then。此外,您想要的输出似乎表明您想要线性执行,而不是并发 -
我不想使用
Promise.all,因为我读到完成的承诺的顺序不能保证是连续的?这不正确吗?你是对的@smac89,我想要线性执行。 -
您已经发送了请求,因此它们将同时发送,并以随机顺序完成。您可以使用 promise.all 来允许它继续进行,同时在完成所有操作后仍能以预期的顺序获得结果。如果您想一次只发送一个请求,则需要将您的 .map 替换为 .reduce,。
标签: javascript arrays promise