Javascript 使用setTimeout在forEach完成后调用回调函数?
好的,这个问题以前被问过,但我没有看到我喜欢的答案,我认为我找到了解决方案,但我想确认一下。基本上,我在React中调用一个函数,其中包含一个Javascript 使用setTimeout在forEach完成后调用回调函数?,javascript,foreach,Javascript,Foreach,好的,这个问题以前被问过,但我没有看到我喜欢的答案,我认为我找到了解决方案,但我想确认一下。基本上,我在React中调用一个函数,其中包含一个forEach循环。我需要在forEach循环完成后等待执行某些操作 我可以为此使用setTimeout(function(){},0)吗?我知道一旦清除堆栈,就会调用setTimeout,但这是否适用于异步函数 这就是我试图实现的目标: function doSomethingAsync(){ arr.forEach(function(){
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
只是引入了一种混乱状态:它可能在异步工作完成之前触发,也可能在异步工作完成之后触发。如果在所有异步请求完成后需要回调,那么您调用的函数必须提供回调供您使用
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" );