У меня есть следующий код:
for(var i = 0; i < list.length; i++){
mc_cli.get(list[i], function(err, response) {
do_something(i);
});
}
mc_cli
- это соединение с базой данных memcached. Как вы можете себе представить, функция обратного вызова является асинхронной, поэтому она может быть выполнена, когда цикл for уже завершен. Кроме того, при вызове таким образом do_something(i)
он всегда использует последнее значение цикла for.
Я попытался с закрытием таким образом
do_something((function(x){return x})(i))
но, по-видимому, это снова использует всегда последнее значение индекса цикла for.
Я также попытался объявить функцию перед циклом for следующим образом:
var create_closure = function(i) {
return function() {
return i;
}
}
а затем вызов
do_something(create_closure(i)())
но снова без успеха, при этом возвращаемое значение всегда является последним значением цикла for.
Может ли кто-нибудь сказать мне, что я делаю неправильно с закрытием? Я думал, что понял их, но я не могу понять, почему это не работает.