如何将索引传递给 setTimeout

How to pass an index into setTimeout

我知道这里有很多类似的问题,但是 none 我已经看到了答案。如果我错过了一个,这是重复的,抱歉。

我正在尝试使用 d3 修改我的图形,并希望使用 setTimeout space 以一种美观的方式进行操作。

我有

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

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

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

您在尝试传递密钥时调用了匿名函数。改为使用闭包。请务必制作密钥的本地副本!

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

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

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

匿名函数绑定:

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