непонятное изменение переменной внутри $.get()
Доброго времени суток,
Подскажите пжалуйста у меня какого-то черта меняется значение внешней переменной после попадания в $.get() допустим: for(i=0;i<2;i++){ $.get('http://yandex.ru', function(data){ alert(i); // i постоянно возвращает единицу (1) !!! = ПОЧЕМУ?! }) } возможно в данном примере моджет быть все ок протсетить нет времени, однако структура та же что и в моей коде так что - надеюсь на ваше понимание и помощь!! |
Оно не меняется, вот именно потому и. Слелайте <4, будет "постоянно" возвращать 3. То есть последнее значение i.
|
ПОЧЕМУ НЕ МЕНЯЕТСЯ?!
|
К тому времени когда колбэк очухается, цикл уже давным-давно кончился и это i == последнему значению на 1 меньше заданного.
Более того, вы уже можете успеть заюзать эту i еще стопицот раз далее по тексту и тогда алерт вам покажет вообще хрен знает какое i. |
Я понятия не имеют что за шняга этот get, но судя по синтаксису нечто асинхронное. Правильно? Функция которая прописана в задний вызов будет выполнена в будущем. В будущем вокруг этой функции уже все поменяется. В том числе и все глобальные i. Так понятно?
|
а притормозить цикл как то можно для ожидания колбека?!
|
Цитата:
var callback = function(data){ alert(this.i); }; for(var i=0; i<5; i++) { $.ajax({ url: 'http://yandex.ru', context: {i:i}, success: callback }); } |
Надо бы посмотреть за что отвечает счетчик. Возможно такое делается по-другому.
Смысл в том что i в алерте - reference. А вам надо скопировать текущее value счетчика в функции которая выполнится в будущем. Ну надо же, искал js value reference callback и попал в точности на ваш пример с $.get http://stackoverflow.com/questions/2...back-functions В общем как предыдущий читатель и сформулировал. |
Ну да, будущее тут не при чем. Кложа внутри цикла - общая проблема. Асинхрон - частная.
Мне тоже надо запомнить, постоянно забываю как это делается в таких случаях. Вот так return function() { alert(i); }// текущее значение скопировано ЗЫ. Офф. А вот на php это делается без шума и пыли: $f = function($data) use($i) {}; |
Часовой пояс GMT +3, время: 10:16. |