2013-10-04 3 views
0

Я хочу ждать весь обратный вызов функции завершения, а затем возвращает конечный результат, например:Javascript возвращаемое значение из нескольких обратного вызова

    var jsonArray = new Array(); 

        for(var i = 0; i < 10; i++) 
        { 
         jQueryFunction(i, function(json){ 
          jsonArray[i] = json; 
         }); 
        } 

        return jsonArray; 

jQueryFunction является функцией, которая содержит асинхронный Аякс и обратный вызов, возвращает значение, которое называется json. Я хочу дождаться окончания цикла цикла, а затем поместить все возвращаемые значения в jsonArray, верну его окончательно.

Моя цель состоит в том, чтобы ждать завершения всех обратных вызовов jQueryFunction и сохранить их возвращение в jsonArray, а затем вернуть jsonArray в конце. Моя предыдущая цель не работает, потому что она возвращает jsonArray сразу и не ждать, пока цикл

Я попытался, как это:

   function jQueryFunction(ptd_url, callback) 
       { 
        $.ajax 
          ({ 
           type: "GET", 
           async: true, 
           url: ptd_url, 
           dataType: "jsonp", 
           jsonp: "callback", 
           jsonpCallback: "tpsHandler", 
           success: function(json) 
           { 
            return callback(json); 
           } 
          }); 
       } 

       function finalResultFunction() 
       { 
        var jsonArray = new Array(); 

        for(var i = 0; i < 10; i++) 
        { 
         jQueryFunction(1, function(json){ 
          jsonArray[i] = json; 
          alert(jsonArray[i]); 
         }); 
        } 

        $.when.apply($, jsonArray).done(function(){ 
         alert(jsonArray[0]); 
        ... 
       } 

       setInterval(finalResultFunction,1000); 

Первое предупреждение показывает мне правильный объект, но второй по-прежнему показывает мне null. Зачем? Как это исправить?

+0

так что же ваш _специфичный вопрос? – andi

+0

Какая цель? – tymeJV

+0

* Я хочу подождать окончания цикла for *. Вы используете синхронный AJAX? – Oriol

ответ

2

Вы можете использовать jQuery when, чтобы подождать по нескольким запросам. Вам просто нужен jQueryFunction, чтобы вернуть jqXHR.

function jQueryFunction(){ 
    return $.ajax(/* ... */); 
} 

var requests = []; 

for(var i = 0; i < 10; i++) 
{ 
    var xhr = jQueryFunction(/* ... */); 

    requests.push(xhr); 
} 

$.when.apply($, requests).done(function(){ 

    // EVERYTHING IS NOW DONE, DO SOMETHING HERE 

}); 
+0

О, такой прекрасный код +1. – ncm

+0

Не работает. Если я использую jQueryFunction (i, function (json) {jsonArray.push (json);}); – user2597504

+0

Вы должны быть более конкретными, чем просто «не работает». На что это связано и есть ошибки на консоли. Концепция работает. –

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