Javascript 在承诺中使用循环的正确方法

Javascript 在承诺中使用循环的正确方法,javascript,asynchronous,callback,promise,Javascript,Asynchronous,Callback,Promise,根据这个(新手错误2),我不应该在承诺中使用循环,而是Promise.all(iterable) 这真的适用于所有循环吗Promise.all(iterable)采用大小为n的数组。如果我使用Promise.all(iterable),那么我将得到一个大小为n的数组(即iterable_a) 如果我想迭代iterable,只想将满足条件的某些元素放入另一个iterable(例如iterable_B),并想返回iterable_B而不是iterable_A,该怎么办?我是否也应该使用Promise

根据这个(新手错误2),我不应该在承诺中使用循环,而是
Promise.all(iterable)

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

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

我不应该在承诺中使用循环

不,相反,你不应该在循环中使用承诺

当然,这也太笼统了。有时候你只需要一个循环结构。您不能忘记收集在循环体中创建的承诺,这些承诺可以传递给
Promise.all
,等待在该循环中启动的所有异步操作

正如本文中建议的那样,您只需
从回调中返回一个承诺(一如既往)。使用
for
/
while
/
.forEach
会有点困难,因为您必须在某些数组中手动推送承诺(这不仅难看,而且容易出错)

但是,如果您不在循环中处理异步任务,您可以做任何您想做的事情。例如,两者

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

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


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

您可以在承诺中使用循环,只要它们不需要花费太多时间来执行,并且您不在循环中执行任何异步任务。啊,是的。这是有道理的。上面链接中的文章对此并不清楚。它给人的印象是,所有循环都是被禁止的。在你看来,是否应该重构以下函数?我特别指的是该函数中的回调、延迟和for循环:
var getAllFooById=function(id){var dfd=$q.defer();db.allDocs({include_docs:true},function(err,response){if(err){console.log(err);dfd.reject(err);}else{var fooArray=[];for(var i=0;ifor
-循环保持现在的状态还是将其更改为
Promise.all()
?@thadeuszlay:我不知道db.allDocs
是什么,所以我不能肯定,但它看起来肯定是异步的。如果不是,你就不必使用延迟。但是是的,回调中的
for
循环没有做任何异步的事情,它只是
响应上的一个同步循环,不需要使用
Promise、 所有的
都在里面。但是,您的回调应该只执行
if(err)dfd.reject(err);else dfd.resolve(response);
和其他操作,所有的
控制台.log
和循环操作都应该在一个单独的
回调中进行。
然后()。
Promise.all(promises).then((values) => values.filter(syncPredicate))