根据这个link(菜鸟错误#2)我不应该在 Promises 中使用循环,而是Promise.all(iterable)
.
这真的适用于所有循环吗?Promise.all(iterable)
接受一个大小为 n 的数组。如果我用Promise.all(iterable)
,然后我会得到一个结果(即 iterable_A)一个大小为 n 的数组。
如果我想迭代 iterable,并且只想将满足条件的某些元素放入另一个 iterable(例如 iterable_B)并希望返回 iterable_B 而不是 iterable_A,该怎么办?我应该使用Promise.all()
too?
我不应该在 Promise 中使用循环
不,相反:您不应该在循环中使用 Promise。
当然这也太笼统了。有时您只需要一个循环结构。你绝对不能做的是忘记收集在循环体中创建的承诺在一些可以传递给的迭代中Promise.all
,等待该循环中开始的所有异步事物。
The map method正如文章中所建议的,自然可以做到这一点,你只需要return
来自回调的承诺(一如既往)。使用for
/while
/.forEach
使它变得有点困难,因为您必须手动将承诺推送到某个数组中(这不仅丑陋而且容易出错)。
但是,如果您不在循环内处理异步任务,则可以执行任何您想做的操作。例如,两者
Promise.all(values.filter(syncPredicate).map(asyncFn))
and
Promise.all(promises).then((values) => values.filter(syncPredicate))
完全没问题。当您有异步过滤谓词时,它确实会变得有点复杂,我建议在这种情况下寻找 Promise 实用程序库。
此外,您还必须意识到从同步循环构造中启动的异步任务将并行运行。如果您打算按顺序运行它们(等待每次迭代),您应该尝试制定循环使用递归结构.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)