javascript – 关于异步函数的setTimeout

前端之家收集整理的这篇文章主要介绍了javascript – 关于异步函数的setTimeout前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个异步函数,我希望在被触发之前有5000ms的延迟.我试图使用setTimeout()来实现这一点.这个异步函数发生在一个运行多次的循环中,异步函数每次都传递不同的数据,因此这里不能使用setInterval().

问题:异步功能立即被触发而没有延迟(控制台立即打印5个完成消息并且没有任何延迟地循环.发生了什么,我该如何解决

Javascript代码

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);
    }
});

猜你在找的JavaScript相关文章