使用setTimeout完成一次forEach调用回调函数?

时间:2016-02-04 11:53:01

标签: javascript foreach

好的,所以之前已经问过这个问题,但我没有看到我喜欢的答案,并认为我找到了解决方案,但我想确认一下。基本上我在React中调用一个函数,其中有一个forEach循环。我需要等待forEach循环完成后再做一些事情。

我可以使用setTimeout(function(){},0)吗?我知道一旦清除堆栈就会调用setTimeout,但这是否适用于异步函数?

这就是我想要完成的事情:

function doSomethingAsync(){
  arr.forEach(function(){
    //loop through this thing
  });
  setTimeout(function(){
   callback()
  }, 0);
};

我在过去30分钟内一直在测试它,它正在做我想要的......但我不想假设这将是一种一致的方法。想法?

2 个答案:

答案 0 :(得分:4)

  

基本上我在React中调用一个函数,里面有一个forEach循环。在forEach循环完成后我需要等待做一些事情。

     

我可以使用setTimeout(function(){},0)吗?

没有。有两种可能性:

  1. forEach正在进行同步工作,在这种情况下setTimeout是不必要且没有意义的 - 包含它的函数在循环完成之前不会返回,所以你可以这样做你打电话给那个功能后的下一件事。

  2. forEach正在启动异步工作,在这种情况下setTimeout只会引入混乱情况:它可能会在异步工作完成之前触发,或者异步工作完成后可能会触发。如果在完成所有这些异步请求后需要回调,则您调用的函数必须提供给您使用的函数。

  3. 所以要么你不需要它,要么你不能使用它。

答案 1 :(得分:-1)

如果您在forEach内部执行异步内容,例如服务器请求,那么使用延迟对象和jQuery.when可能是个好主意。以下示例取自https://api.jquery.com/jquery.when/

var d1 = $.Deferred();
var d2 = $.Deferred();

$.when( d1, d2 ).done(function ( v1, v2 ) {
    console.log( v1 ); // "Fish"
    console.log( v2 ); // "Pizza"
});

d1.resolve( "Fish" );
d2.resolve( "Pizza" );