[英]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.