2015-06-01 4 views
1

Я знаю, что есть много вопросов относительно этого, но все же я не могу найти правильный ответ, который заставляет мой код работать должным образом.Ajax call in loop

У меня есть одна функция, определенная для вызова ajax, которую я не могу изменить из-за проблемы с безопасностью. Вот как я называю эту функцию

var JsonIQDetails = JSON.stringify(input);//Some input 

//pram 1:MethodUrl, 2:JsonObject, 3:ReturnType, 4:SuccessCallBackFunction 
InvokeAjaxCall(Url, JsonIQDetails, "json", Success); 

У меня есть массив объектов (более 500). Поскольку JSON становится очень длинным, поэтому я не могу выполнить вызов ajax. Опять же из-за проблемы с безопасностью я тоже не могу изменить файл конфигурации. Таким образом, длина JSON не может быть увеличена.

Я разделив массив на небольшие куски 100 и вызов метода

for (i = 0, j = mainObject.length; i < j; i += chunk) { 
    var newSubObject = mainObject.slice(i, i + chunk); 
    InvokeAjaxCall(Url, newSubObject, "json", Success); 

    function Success(data) { 
     if (!data) { 
      alert("Failed"); 
      break; 
     } 
    } 
} 

его перемещение без завершения цикла for и выполнения следующего кода. Поэтому я хочу сначала заполнить цикл for (возможно, асинхронный)

Спасибо в Advance .. !!!

+0

Объяснение «перемещение без завершения цикла» совсем неясно ... что это значит? – charlietfl

+0

Значит, он идет вперед, не завершая цикл for ... –

+0

Что будет дальше? Вы должны объяснить проблему с большей ясностью. Если все эти запросы должны быть выполнены до запуска другого кода, вам нужно будет использовать обещания для выполнения следующей последовательности кода. – charlietfl

ответ

0

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

var ajaxRecursive = function(i, j, c){ 
    if(i < j){ 
     var newSubObject = mainObject.slice(i, i + chunk); 
     InvokeAjaxCall(Url, newSubObject , "json", function(data){ 
      //do stuff with data 
      ajaxRecursive(i+=chunk, j,chunk); 
     }); 
    } 
} 


ajaxRecursive(0, mainObject.length, chunk); 

Предположим, что другие переменные в пределах ajaxRecursive определены глобально.

Описание Обновление:

  • Вы можете избавиться от функции "успех" и просто создать его annonymously.
+1

Его работа .. Спасибо .. :) –