【问题标题】:Foreach callback when finish [duplicate]完成时的 Foreach 回调[重复]
【发布时间】:2023-03-28 13:12:01
【问题描述】:

我想在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 中使用了一个异步函数。

标签: javascript node.js


【解决方案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 )
猜你喜欢
  • 2013-09-29
  • 2014-12-25
  • 2017-11-10
  • 2018-10-30
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多