完成时的 Foreach 回调[重复]

Posted

技术标签:

【中文标题】完成时的 Foreach 回调[重复]【英文标题】:Foreach callback when finish [duplicate] 【发布时间】:2015-09-20 12:03:20 【问题描述】:

我想在foreach 完成后执行回调,但它不能正常工作。我该怎么做?

var response = [];
myArray.forEach(function(data) 
    data.asyncFunction(function(result) 
         response.push(result);
    );
, function() 
    console.log(response); // Not being called.
);

console.log(response); // (Empty) Executed before foreach finish.

【问题讨论】:

您是否在forEach 中执行任何异步操作? "//(空)在 foreach 完成之前执行。" 不正确的假设。 forEach 实际上是完整的。你误诊了问题。请为您的问题提供更多背景信息。 @thefourtheye 我编辑了因为我在我的 foreach 中使用了一个异步函数。 【参考方案1】:

试试这个:

myArray.forEach(function(element, index, array)
  asynchronous(function(data)
       if (index === myArray.length - 1) 
           response.push(data);
           functionAfterForEach();
       
  )
);

【讨论】:

myArray 没有改变......所以每当你要求它的长度时,它都会给出正确的长度@Kevin B 评论当然是对您答案的原始迭代。不过,我认为它仍然存在。如果循环的最后一次迭代完成了除最后一次之外的任何事情,那么您将很快调用回调。 对不起@Kevin B 这对我来说是个愚蠢的错误 抱歉,请参阅编辑评论。我有一个坏习惯,在我完成之前点击进入 cmets。 :)【参考方案2】:

因为forEach 只接受一个callback。由于您在forEach 内部调用异步方法,您需要检查所有异步调用是否已完成

var response = [];
myArray.forEach(function(data, index) 
    data.asyncFunction(function(result) 
         response.push(result);
         if(response.length  === myArray.length) 
                 //foreach work done
         
    );
);

【讨论】:

我编辑了我的问题,因为我在 foreach 中使用了异步函数。你能看看吗?谢谢。 如果它真的是异步的,你不能相信当最后一个索引被调用时它们都已经完成了。最好将 myArray.length 与 response.length 进行比较。 @Anoop 谢谢大家,我明白了!对于这个愚蠢的问题,我们深表歉意。 @LucianoNascimento 这不是愚蠢的问题。它发生在每个人身上 您也可以使用简单的整数变量并与 myArray.length 进行比较(例如:if( itemsProcessed === myArray.length )

以上是关于完成时的 Foreach 回调[重复]的主要内容,如果未能解决你的问题,请参考以下文章

循环javascript时的回调方法

在 forEach 循环完成后运行回调函数

.forEach 完成后执行回调函数

完成 fs.writeFilesync 时的回调

从mongoDB集合中获取N条最新记录时的回调函数[重复]

Angular 2:ngFor 完成时的回调