javascript - 异步函数上的setTimeout

标签 javascript jquery

我有一个异步函数,我希望它在被触发之前有 5000 毫秒的延迟。我正在尝试使用 setTimeout() 来实现这一点。这个async函数出现在一个循环运行多次,每次async函数传递不同的数据,所以这里不能使用setInterval()

问题: 异步函数立即被触发,没有任何延迟(控制台立即打印 5 条 Done 消息,并且没有任何延迟地循环。发生了什么,我该如何解决?

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 秒后,循环已经结束,listing 变量将等于 listings 中的最后一个元素。

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 - 异步函数上的setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8279035/

相关文章:

javascript 假导航器

javascript - 光滑的 slider 加载后运行脚本

javascript - 视频直播

javascript - WebSocket如何压缩消息?

javascript - jQuery 自制幻灯片代码似乎没有获取图像的当前上下文

jquery - 选择 <header> 的外部元素并仅切换一个元素

javascript - 将数据传递给 iframe 以自定义内容

javascript - 为元素的子元素着色

javascript - 悬停时保持关注其他(z 顺序)后面的元素

jquery - jQuery 中的关键帧事件无需刷新浏览器