2013-04-08 3 views
2

У меня есть несколько запросов AJAX, которые отправляются из цикла for, и вы хотите отправить некоторые данные в функции обратного вызова в зависимости от положения в цикле.Обработка независимых данных из нескольких запросов AJAX JQuery

Когда я пытаюсь прикрепить функцию к каждому запросу, все они, кажется, чтобы получить данные из последнего вызова, например,

for(var i=0; i < 4; i++){ 
    data = ... //some unique data 
    req = $.post('/update/add', data, function(r_data, textStatus, jqxhr){ 
     console.log(data); 
    }, "json") 
} 

бы дать мне данные из г = 3 записи вместо 4 разных входа. Как передать эти данные в функции обратного вызова?

Спасибо, ребята ...

ответ

3

Проблема заключается в том, что, когда замыкание создается по переменной i, она ссылается на ту же переменную вместо создания новой переменной i. Чтобы избежать этого нежелательного эффекта, вы можете сделать следующее.

for(var i=0; i < 4; i++){ 
    data = ... //some unique data 
    req = $.post('/update/add', data, (function (i) { 
     //return a new callback function 
     return function (r_data, textStatus, jqxhr) { 
      //callback logic 
      //i will be the right index now 
     }; 
    })(i), "json"); 
} 

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

ПРИМЕЧАНИЕ. Чтобы оптимизировать код, вы можете избежать создания новой функции самоисполнения каждый раз.

function createCallback(i) { 
    return function (r_data, textStatus, jqxhr) { 
     console.log(i); 
    }; 
} 

/* 
    loop 
     post(..., createCallback(i)); 
*/ 
+0

oh .. the (i) в конце, это то, чего я отсутствовал. Спасибо. lemme проверка. – xcorat

+0

hmm .. У меня есть другие аргументы функции обратного вызова. Как это будет работать в этой ситуации? (обновленный вопрос) – xcorat

+0

Если вы заметили, есть самозапускаемая функция, которая принимает переменную 'i' в качестве аргумента a, а затем возвращает новую функцию обратного вызова. – plalx

Смежные вопросы