在 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))
完全没问题。当你有一个异步过滤谓词时,它确实变得有点复杂,我建议在这种情况下寻找一个承诺实用程序库。
您还必须意识到,从同步循环构造中启动的异步任务将 运行 并行进行。如果您打算按顺序 运行 它们(等待每次迭代),您应该尝试制定循环 .
根据这个 link(新手错误 #2)我不应该在 Promises 中使用循环,而是 Promise.all(iterable)
.
这真的适用于所有循环吗? Promise.all(iterable)
采用大小为 n 的数组。如果我使用 Promise.all(iterable)
,那么我会得到一个大小为 n.
如果我想遍历 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))
完全没问题。当你有一个异步过滤谓词时,它确实变得有点复杂,我建议在这种情况下寻找一个承诺实用程序库。
您还必须意识到,从同步循环构造中启动的异步任务将 运行 并行进行。如果您打算按顺序 运行 它们(等待每次迭代),您应该尝试制定循环