Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.01.2014, 09:49
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

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

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


возможно в данном примере моджет быть все ок протсетить нет времени, однако структура та же что и в моей коде так что
- надеюсь на ваше понимание и помощь!!
Ответить с цитированием
  #2 (permalink)  
Старый 23.01.2014, 09:53
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,719

Оно не меняется, вот именно потому и. Слелайте <4, будет "постоянно" возвращать 3. То есть последнее значение i.
Ответить с цитированием
  #3 (permalink)  
Старый 23.01.2014, 09:58
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

ПОЧЕМУ НЕ МЕНЯЕТСЯ?!
Ответить с цитированием
  #4 (permalink)  
Старый 23.01.2014, 10:02
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,719

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

Более того, вы уже можете успеть заюзать эту i еще стопицот раз далее по тексту и тогда алерт вам покажет вообще хрен знает какое i.
Ответить с цитированием
  #5 (permalink)  
Старый 23.01.2014, 10:04
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,719

Я понятия не имеют что за шняга этот get, но судя по синтаксису нечто асинхронное. Правильно? Функция которая прописана в задний вызов будет выполнена в будущем. В будущем вокруг этой функции уже все поменяется. В том числе и все глобальные i. Так понятно?
Ответить с цитированием
  #6 (permalink)  
Старый 23.01.2014, 10:29
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

а притормозить цикл как то можно для ожидания колбека?!
Ответить с цитированием
  #7 (permalink)  
Старый 23.01.2014, 10:42
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от 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
    });
}
Ответить с цитированием
  #8 (permalink)  
Старый 23.01.2014, 11:10
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,719

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

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

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

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

В общем как предыдущий читатель и сформулировал.
Ответить с цитированием
  #9 (permalink)  
Старый 23.01.2014, 11:15
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,719

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

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

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

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

Последний раз редактировалось kostyanet, 23.01.2014 в 11:17.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение значения переменной внутри обработчика события jQuery Mbenga Общие вопросы Javascript 2 01.07.2013 09:57
изменение значения глобальной переменной внутри функции mgmarket Серверные языки и технологии 14 12.09.2011 23:56
изменение переменной в функции ananax Общие вопросы Javascript 19 12.01.2011 11:09
Изменение и отображение значения переменной по клику Allan Stark Общие вопросы Javascript 1 25.04.2010 14:50
изменение переменной Ilja_ORDY Общие вопросы Javascript 3 09.09.2008 17:56