2014-08-29 4 views
0

Я поставил асинхронную функцию обратного вызова (что-то вроде $.ajax) внутри цикла for. Это выглядело более или менее, как (редактирования: обновленный код, см комментарии):JSHint: асинхронная функция в цикле

var i = 0; 

for (; i < 5; i++) { 
    (function(index) { 
    $.ajax({ 
     url: "", 
     success: function() { 
     console.log(index); 
     } 
    }); 
    })(i); 
} 

Он работал, но JSHint дал мне предупреждение о том, что-то вроде:

«Не помещайте функций внутри петель "

Обычно я мог просто разместить свою функцию callback вне моего цикла и вызвать эту функцию для каждой итерации. К сожалению, мне нужен доступ к переменным, которые назначаются внутри цикла (например, i). Поэтому я ищу решение, чтобы сделать что-то, как показано ниже:

var i = 0; 

function callback(data) { 
    // I want to have access to "i" (0, 1, 2, 3, 4) and the AJAX "data" 
    // in this function. But I only have access to "data", because "i" 
    // will always be 5 
} 

for (; i < 5; i++) { 
    $.ajax({ 
    url: "", 
    success: callback 
    }); 
} 
+3

Ну, в вашем первом примере 'i' также будет' 5' во всех обратных вызовах. См. [Внутренние циклы закрытия JavaScript - простой практический пример] (http://stackoverflow.com/q/750486/218196). –

+1

У вас есть петля ... вы не можете отправить один запрос со всеми данными? – tymeJV

+0

Просто исправьте цикл for и добавьте эту строку в свой ajax-вызов 'async: false' – Hackerman

ответ

2

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

var i = 0; 
function callback(i) { 
    return function (data) { 
    // I want to have access to "i" (0, 1, 2, 3, 4) and the AJAX "data" 
    // in this function. 
    console.log(i) 
    } 
} 

for (; i < 5; i++) { 
    $.ajax({ 
    url: "", 
    success: callback(i) 
    }); 
} 

Однако, конечно, было бы лучше представить эти данные одним запросом, а не зацикливанием.

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