在 Promises 中使用循环的正确方法

Proper way of using loops in Promises

根据这个 link(新手错误 #2)我不应该在 Promises 中使用循环,而是 Promise.all(iterable).

这真的适用于所有循环吗? Promise.all(iterable) 采用大小为 n 的数组。如果我使用 Promise.all(iterable),那么我会得到一个大小为 n.

的数组(即 iterable_A)

如果我想遍历 iterable 并且只想将满足我条件的某些元素放入另一个 iterable(例如 iterable_B)并且想要 return 而不是 iterable_B 怎么办iterable_A?我也应该使用 Promise.all() 吗?

I should not use loops within Promises

不,恰恰相反:你不应该在循环中使用承诺。

当然这也太笼统了。有时你只需要一个循环结构。你不能做的是 忘记收集在循环体中创建的承诺 在一些你可以传递给 Promise.all 的迭代器中等待所有异步的事情开始于那个循环。

文章中建议的 map method 自然会这样做,您只需要 return 来自回调的承诺(一如既往)。使用 for/while/.forEach 会使它变得有点困难,因为您必须手动将 promise 推送到某个数组中(这不仅丑陋而且容易出错)。

但是,如果您不在循环内处理异步任务,则可以做任何您想做的事情。例如,两者

Promise.all(values.filter(syncPredicate).map(asyncFn))

Promise.all(promises).then((values) => values.filter(syncPredicate))

完全没问题。当你有一个异步过滤谓词时,它确实变得有点复杂,我建议在这种情况下寻找一个承诺实用程序库。

您还必须意识到,从同步循环构造中启动的异步任务将 运行 并行进行。如果您打算按顺序 运行 它们(等待每次迭代),您应该尝试制定循环 .