2015-03-25 4 views
0

Я знаю, что здесь есть много вопросов, подобных этому, но ни один из них, который я видел, не ответил на это для меня. Если я пропустил один, и это дубликат, извините.Как передать индекс в setTimeout

Я пытаюсь изменить свой график с помощью 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, так что извините, если это что-то исключительно очевидное, я не могу найти ответ нигде.

ответ

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

спасибо, есть общее соглашение для javascript в отношении этого. то есть. Лучше ли связывать такие переменные или использовать отдельную функцию? – Damien

+0

@Damien Я не уверен в том, что считается «правильным» (я уверен, что вы услышите много, часто противоположных мнений.), Но я всегда предпочитаю ясность в отношении умения. На мой взгляд, отдельная функция чище и проще отлаживать. Учитывая, что вы должны действительно заглянуть в '.bind', потому что это может быть чрезвычайно полезно во многих ситуациях. –

0

Вы вызвали свою анонимную функцию, когда пытались передать ключ. Вместо этого используйте закрытие. Обязательно сделайте локальную копию ключа!

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

    setTimeout(function() { 
     graph.removeLink(alist[keyCopy].source.name, alist[keyCopy].target.name); 
    }, key*500+200); 
} 
Смежные вопросы