遍历完成后的回调函数

9

我希望在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中执行任何异步操作吗? - thefourtheye
“// (Empty) Executed before foreach finish.” 这是错误的假设。实际上,forEach 已经完成了。您正在误诊问题。请提供更多上下文来解释您的问题。 - Kevin B
@thefourtheye,我进行了编辑,因为我在我的foreach内部使用了异步函数。 - Luciano Nascimento
2个回答

12

因为 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内部使用了一个异步函数。你能看一下吗?谢谢。 - Luciano Nascimento
2
如果它是真正的异步,你不能相信当最后一个索引被调用时它们都已完成。最好将myArray.length与response.length进行比较。 - Kevin B
@Anoop 谢谢你们,我明白了!对于那个愚蠢的问题感到抱歉。 - Luciano Nascimento
@LucianoNascimento 这不是愚蠢的问题。每个人都会遇到这种情况。 - Anoop
你可以使用一个简单的整数变量,并与 myArray.length 进行比较(例如:if( itemsProcessed === myArray.length ))。 - JavierFuentes

4
尝试这个:

试一下:

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

myArray 没有改变... 所以每当你调用它的长度时,它都会给出正确的长度 @Kevin B - PaulShovan
1
这个评论当然是针对你最初的回答。虽然我认为它仍然适用。如果循环的最后一次迭代完成时不是最后一个,那么你会过早地调用回调函数。 - Kevin B
抱歉,@Kevin B,这是我的一个愚蠢错误。 - PaulShovan
抱歉,看到评论的编辑了。我有一个坏习惯,在评论中还没写完就按下回车键。 :) - Kevin B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接