Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   непонятное изменение переменной внутри $.get() (https://javascript.ru/forum/events/44526-neponyatnoe-izmenenie-peremennojj-vnutri-%24-get.html)

Brook 23.01.2014 11:49

непонятное изменение переменной внутри $.get()
 
Доброго времени суток,
Подскажите пжалуйста у меня какого-то черта меняется значение внешней переменной после попадания в $.get()

допустим:
for(i=0;i<2;i++){
        $.get('http://yandex.ru', function(data){
         alert(i);  // i постоянно возвращает единицу (1) !!!  = ПОЧЕМУ?!
        }) 
      }


возможно в данном примере моджет быть все ок протсетить нет времени, однако структура та же что и в моей коде так что
- надеюсь на ваше понимание и помощь!!

kostyanet 23.01.2014 11:53

Оно не меняется, вот именно потому и. Слелайте <4, будет "постоянно" возвращать 3. То есть последнее значение i.

Brook 23.01.2014 11:58

ПОЧЕМУ НЕ МЕНЯЕТСЯ?!

kostyanet 23.01.2014 12:02

К тому времени когда колбэк очухается, цикл уже давным-давно кончился и это i == последнему значению на 1 меньше заданного.

Более того, вы уже можете успеть заюзать эту i еще стопицот раз далее по тексту и тогда алерт вам покажет вообще хрен знает какое i.

kostyanet 23.01.2014 12:04

Я понятия не имеют что за шняга этот get, но судя по синтаксису нечто асинхронное. Правильно? Функция которая прописана в задний вызов будет выполнена в будущем. В будущем вокруг этой функции уже все поменяется. В том числе и все глобальные i. Так понятно?

Brook 23.01.2014 12:29

а притормозить цикл как то можно для ожидания колбека?!

Яростный Меч 23.01.2014 12:42

Цитата:

Сообщение от Brook
а притормозить цикл как то можно для ожидания колбека?!

нет

var callback = function(data){
    alert(this.i);
}; 
for(var i=0; i<5; i++) {
    $.ajax({ 
        url: 'http://yandex.ru',
        context: {i:i},
        success: callback
    });
}

kostyanet 23.01.2014 13:10

Надо бы посмотреть за что отвечает счетчик. Возможно такое делается по-другому.

Смысл в том что i в алерте - reference. А вам надо скопировать текущее value счетчика в функции которая выполнится в будущем.

Ну надо же, искал js value reference callback и попал в точности на ваш пример с $.get

http://stackoverflow.com/questions/2...back-functions

В общем как предыдущий читатель и сформулировал.

kostyanet 23.01.2014 13:15

Ну да, будущее тут не при чем. Кложа внутри цикла - общая проблема. Асинхрон - частная.

Мне тоже надо запомнить, постоянно забываю как это делается в таких случаях. Вот так

return function() { alert(i); }// текущее значение скопировано

ЗЫ. Офф. А вот на php это делается без шума и пыли: $f = function($data) use($i) {};


Часовой пояс GMT +3, время: 22:20.