繁体   English   中英

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

[英]Proper way of using loops in Promises

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

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

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

我不应该在Promises中使用循环

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

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

文章中建议的map方法自然会这样做,你只需要从回调中return一个promise(一如既往)。 使用for / while / .forEach会让你有点困难,因为你必须手动推送某些数组中的promises(这不仅是丑陋的,而且也是errorprone)。

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

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

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

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

此外,您必须意识到从同步循环结构中启动的异步任务将并行运行。 如果您打算按顺序运行它们(等待每次迭代),您应该尝试使用递归结构来表示循环

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM