2012-04-07 4 views
9

Я потерян. Как передать переменную цикла в вызов AJAX .done()?

for (var i in obj) { 
    $.ajax(/script/).done(function(data){ console.log(data); }); 
} 

Очевидно, что если бы я сделать console.log(i+' '+data)я вернет самый последний ключ в объекте obj на каждой итерации. Документация не позволяет мне.

+0

Я полагаю, что я мог бы использовать 'success', но, как я понимаю, что осуждается в настоящее время. – philtune

ответ

9

Вы можете использовать замыкание (через функцию, выполняющиеся себя), чтобы захватить значение i для каждого вызова цикла, как это:

for (var i in obj) { 
    (function(index) { 
     // you can use the variable "index" here instead of i 
     $.ajax(/script/).done(function(data){ console.log(data); }); 
    })(i); 
} 
+0

Закрытие - одна из концепций. Мне всегда было трудно понять время. Спасибо @ jfriend00, я попробую! – philtune

+0

Да, это сработало. Я мог бы даже сделать 'obj [index]'. Еще раз спасибо! – philtune

5

Вы можете просто создать пользовательское поле в объекте, который вас отправьте в $ .ajax(), и это будет поле в «этом», когда будет выполнен обратный вызов обещания.

Например:

$.ajax( { url: " https://localhost/whatever.php ", method: "POST", data: JSON.stringify(object), custom: i // creating a custom field named "custom" }).done(function(data, textStatus, jqXHR) { var index = this.custom; });

+0

Спустя 5 лет я давно забыл, что даже вызвало этот вопрос. ;) – philtune

+0

Мне нужно было знать, как это сделать для недавнего проекта. Итак, когда я это понял, я попытался также передать информацию другим, кто сказал, что они этого хотят ... –

+0

Это лучше с точки зрения асинхронного выполнения jQuery ajax, она явно предоставляет требуемую ссылку на объект/объект, когда обратный вызов выполненный последним во времени. –

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