我有一个异步函数,我希望在被触发之前有5000ms的延迟.我试图使用setTimeout()来实现这一点.这个异步函数发生在一个运行多次的循环中,异步函数每次都传递不同的数据,因此这里不能使用setInterval().
问题:异步功能立即被触发而没有延迟(控制台立即打印5个完成消息并且没有任何延迟地循环.发生了什么,我该如何解决?
someFunction(listings,function() { for (var i in listings ) { var listing = listings[i]; setTimeout(asyncFunction(listing,function(data) { console.log('Done'); }),5000); } });
解决方法
您必须将该函数包装在另一个函数中.目前,您正在调用该函数,并将返回值作为参数传递给setTimeout.下面的代码将(正确)将函数传递给setTimeout. 5秒后,该功能执行.
由于范围问题,我不得不添加两个函数来实现所需的行为. 5秒后,循环已经完成,列表变量将等于列表中的最后一个元素.
someFunction(listings,function() { var counter = 0; // Define counter for 5 second-delays between each call for (var i in listings ) { var listing = listings[i]; (function(listing){ //Closure function setTimeout(function(){ //setTimeout function // Because of the closure,`listing` is unique asyncFunction(listing,function(a,b) { console.log('Done'); }); },5000 * ++counter); //Increase counter for each loop })(listing); } });