Mam następujący kod:Wywołanie asynchroniczne funkcji w pętli for w JavaScript
for(var i = 0; i < list.length; i++){
mc_cli.get(list[i], function(err, response) {
do_something(i);
});
}
mc_cli
jest połączenie z bazą danych memcached. Jak można sobie wyobrazić, funkcja zwrotna jest asynchroniczna, dlatego może być wykonana, gdy pętla for już się zakończyła. Ponadto, wywołując w ten sposób do_something(i)
zawsze używa ostatniej wartości pętli for.
Próbowałem z zamknięciem w ten sposób
do_something((function(x){return x})(i))
ale widocznie to jest zawsze ponownie stosując ostatnią wartość indeksu pętli for.
Próbowałem też deklarowania funkcji przed pętli tak:
var create_closure = function(i) {
return function() {
return i;
}
}
a następnie wywołanie
do_something(create_closure(i)())
ale znowu bez powodzenia, o wartości powrót zawsze jest ostatnia wartość z dla pętli.
Czy ktoś może mi powiedzieć, co robię źle z zamknięciami? Myślałem, że je rozumiem, ale nie rozumiem, dlaczego to nie działa.
dużo dzięki kolego! ten kod mnie uratował !!! : D – DDave
@joseph ci rozumowanie brzmi świetnie. Czy możesz wyjaśnić tę część mnie proszę "Iteracja będzie miała swój własny zakres"? –