如何将索引传递给setTimeout

时间:2015-03-25 22:09:52

标签: javascript d3.js

我知道这里有很多类似的问题,但我见过的都没有为我解答。如果我错过了一个,这是重复的,抱歉。

我正在尝试使用d3修改我的图形,并希望使用setTimeout以一种漂亮的方式来分隔操作。

我有

for (var key in alist){
    setTimeout(function () {
        graph.removeLink(alist[key].source.name, alist[key].target.name);
    }(key), key*500+200);
}

立即调用removeLink函数,而不是等待设置的间隔。

我是javascript的新手,很抱歉,如果这是非常明显的事情,我无法在任何地方找到答案。

2 个答案:

答案 0 :(得分:1)

您可以动态地将变量绑定到匿名函数,或者创建一个函数来包装超时。

匿名函数绑定:

for (var key in alist){
    setTimeout(function (alistitem) {
        graph.removeLink(alistitem.source.name, alistitem.target.name);
    }.bind(this, alist[key]), key*500+200);
}

单独的功能:

function timedRemoveLink(item, time){
   setTimeout(function() {
     graph.removeLink(item.source.name, item.target.name);
   }, time);
};

for (var key in alist){
    timedRemoveLink(alist[key], key*500+200);
}

答案 1 :(得分:0)

当您尝试传入密钥时,您调用了匿名函数。而是使用闭包。确保制作密钥的本地副本!

for (var key in alist){
    var keyCopy = key;

    setTimeout(function () {
        graph.removeLink(alist[keyCopy].source.name, alist[keyCopy].target.name);
    }, key*500+200);
}