Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用setTimeout在forEach完成后调用回调函数?_Javascript_Foreach - Fatal编程技术网

Javascript 使用setTimeout在forEach完成后调用回调函数?

Javascript 使用setTimeout在forEach完成后调用回调函数?,javascript,foreach,Javascript,Foreach,好的,这个问题以前被问过,但我没有看到我喜欢的答案,我认为我找到了解决方案,但我想确认一下。基本上,我在React中调用一个函数,其中包含一个forEach循环。我需要在forEach循环完成后等待执行某些操作 我可以为此使用setTimeout(function(){},0)吗?我知道一旦清除堆栈,就会调用setTimeout,但这是否适用于异步函数 这就是我试图实现的目标: function doSomethingAsync(){ arr.forEach(function(){

好的,这个问题以前被问过,但我没有看到我喜欢的答案,我认为我找到了解决方案,但我想确认一下。基本上,我在React中调用一个函数,其中包含一个
forEach
循环。我需要在
forEach
循环完成后等待执行某些操作

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

这就是我试图实现的目标:

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

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

如果您在
forEach
中执行异步操作,比如服务器请求,那么使用延迟对象和jQuery.when可能是一个好主意。以下示例取自:


如果您在
forEach
中执行异步操作,比如服务器请求,那么最好使用延迟对象和jQuery.when。以下示例取自:

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

我可以为此使用setTimeout(函数(){},0)吗

不,有两种可能性:

  • forEach
    正在执行同步工作,在这种情况下,
    setTimeout
    是不必要且无意义的-包含它的函数在循环完成之前不会返回,因此您可以在调用该函数后执行下一步操作

  • forEach
    正在启动异步工作,在这种情况下,
    setTimeout
    只是引入了一种混乱状态:它可能在异步工作完成之前触发,也可能在异步工作完成之后触发。如果在所有异步请求完成后需要回调,那么您调用的函数必须提供回调供您使用

  • 所以要么你不需要它,要么你不能使用它

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

    我可以为此使用setTimeout(函数(){},0)吗

    不,有两种可能性:

  • forEach
    正在执行同步工作,在这种情况下,
    setTimeout
    是不必要且无意义的-包含它的函数在循环完成之前不会返回,因此您可以在调用该函数后执行下一步操作

  • forEach
    正在启动异步工作,在这种情况下,
    setTimeout
    只是引入了一种混乱状态:它可能在异步工作完成之前触发,也可能在异步工作完成之后触发。如果在所有异步请求完成后需要回调,那么您调用的函数必须提供回调供您使用


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

    你在forEach里面做什么?
    forEach
    不是asynchronous@ekuusela,但内部的函数可以是异步的“所以这个问题以前被问过”然后链接该答案,你在forEach里面做什么?
    forEach
    不是asynchronous@ekuusela,但是里面的函数可以是异步的“所以这个问题以前被问过”,然后链接这个答案,并说出你不喜欢的答案。嗨,TJ,谢谢。我问错了问题。forEach所在的函数是异步的。这就给了我第二个选择,对吗?@ElliottMcNary:如果调用
    forEach
    的函数是异步的,或者
    forEach
    回调中的代码是异步的,那么您需要从所调用的函数中进行某种类型的完成回调<代码>设置超时会很混乱。非常感谢您的解释!嗨,TJ,谢谢。我问错了问题。forEach所在的函数是异步的。这就给了我第二个选择,对吗?@ElliottMcNary:如果调用
    forEach
    的函数是异步的,或者
    forEach
    回调中的代码是异步的,那么您需要从所调用的函数中进行某种类型的完成回调<代码>设置超时会很混乱。非常感谢您的解释!
    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" );