2016-08-05 3 views
4

Я отправляю несколько запросов ajax и хочу получить обратный вызов, если все запросы успешны. Я нашел $.when($.ajax(), [...]).then(function(results){},[...]);, но это работает только тогда, когда вы заранее знаете, сколько вы собираетесь делать. В моем случае это зависит от ввода пользователя.Несколько запросов Ajax (с одним обратным вызовом)

Я попытался следующие, но я не знаю, где и как $.when вписывается в:

$.when(
    $('#piecesTable tr').not(':first').each(function(){ 

     // ...some prep... 

     $.ajax({ 
      // ...args here... 
     }); 
    }) 
).then(function() { 
    // All requests are done 
}); 

Как использовать результаты всех этих отдельных $.ajax звонков с $.when? Или я могу справиться с этим по-другому?

ответ

5

Я думаю, что общая структура того, что вы ищете что-то вроде этого:

var requests = []; 

// Populate requests array with ajax requests. 
requests.push($.ajax({ 
    // ... 
})); 

// Add as many requests as you want to the array. 

$.when.apply($, requests).done(function() { 
    var args = $.prototype.slice.call(arguments); 

    // args should contain the results of your ajax requests. 

    // Do whatever with the results. 
}); 
+0

просто вопрос при установке ajax внутри нажатия на него, давая мне ошибку this.pushStack не является функцией. –

+0

@ H.C: Это 'push', а не' pushStack'. –

0

Из документации JQuery:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).then(myFunc, myFailure); 

Выполнить функцию myFunc, когда оба Аякса запросы будут успешно , или myFailure, если одна из них имеет ошибку.

Таким образом, вы можете использовать эту систему для отправки переменного числа запросов и по-прежнему имеет ту же обратный вызов функцию :)

Адаптированы с @ TW80000 ответом:

var requests = []; 
.... 
$.when.apply($, requests).done(myFunc, myFailure); 
2

Там в современной альтернативе $.when.apply($, arrayOfPromises) зверя : Promise.all:

Promise.all(arrayOfPromises).then(function(arrayOfResults) { 
    // Use arrayOfResults 
}); 

Promise.all ожидает, что массив thenables и возвращает обещание, которое разрешается с помощью массива результатов, когда все последующие действия разрешены. Это хорошо с обещаниями jQuery, потому что все это требует, чтобы они были thenables, какими они являются.

Вы можете использовать это в любом браузере с поддержкой Promise, или если у вас есть Promise прокладка/полипол.

Так что в вашем случае, вы бы построить массив:

var arrayOfPromises = []; 
$('#piecesTable tr').not(':first').each(function(){ 

    // ...some prep... 

    arrayOfPromises.push($.ajax({  // ** Push this promise into the array 
     // ...args here... 
    })); 
}); 

(Или вы можете построить его с $.map или Array#map.)

И затем использовать массив:

Promise.all(arrayOfPromises).then(function(arrayOfResults) { 
    // Use arrayOfResults 
}); 
Смежные вопросы