Javascript如何使用setTimeout对列表进行迭代操作?

标签 javascript closures settimeout anonymous-function

我想做这样的事情:

for(var i=0;i<aList.length;i++)
{
    aList[i].doSomething();
    sleep(500);
}

当然,javascript中没有 sleep 函数,所以我尝试了以下方法:

for(var i=0;i<aList.length;i++)
{
    setTimeout(function(){
        aList[i].doSomething();
    },500);  
}

但是,现在它说 aList[i] 未定义。由于匿名函数是一个闭包,它实际上是从外部函数的作用域中读取aList[i],因此当setTimeout中的函数运行时,i已经改变了。

有什么方法可以实现这一点?

最佳答案

模拟 JavaScript 1.7 的 let 的快速修复是将其包装在函数中:

for(var i=0; i < aList.length; i++) {
    (function(i) {
        setTimeout(function() {
            aList[i].doSomething();
        }, 500 * i); // <-- You need to multiply by i here.
    })(i);
}

我还修复了一个小错误,其中脚本将暂停 500 秒,然后执行所有脚本。 setTimeout 是非阻塞的。

关于Javascript如何使用setTimeout对列表进行迭代操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108346/

相关文章:

javascript - 挖空选择和文本框共享绑定(bind)

arraylist - Groovy 列表中计数最高的对象

C++ 闭包和模板

javascript - clearTimeout() 未按预期运行

javascript - jQuery:如何正确暂停递归?

javascript - 等待所有 dom 更新完成

javascript - 使用 JavaScript 从 Dropbox/文件共享网站下载文件

JavaScript 消除了我网页的静态背景

javascript - 如何获得自动换色?

swift - 我在 CollectionViewCell 中的回调无法正常工作