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

时间:2015-06-16 15:31:25

标签: javascript asynchronous callback promise

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

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

如果我想迭代迭代并且只想将满足我条件的某些元素放到另一个可迭代(例如iterable_B)并想要返回iterable_B而不是iterable_A,该怎么办?我也应该使用Promise.all()吗?

1 个答案:

答案 0 :(得分:4)

  

我不应该在Promises中使用循环

不,反之亦然:你不应该在循环中使用promises。

当然这也太通用了。有时你只需要一个循环结构。你不能做的是忘记在一些可以传递给Promise.all的迭代中收集在循环体中创建的promise,以等待在该循环中启动的所有异步事件。

文章中建议的map method自然会这样做,你只需return来自回调的承诺(一如既往)。使用for / while / .forEach会让你更难以在某些数组中手动​​推送promises(这不仅是丑陋的,而且也是errorprone)。

但是,如果您不在循环中处理异步任务,则可以执行任何操作。例如,两者

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

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

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

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