jQuery Ajax: как дождаться успешного завершения * async * запросов, прежде чем продолжить? - PullRequest
7 голосов
/ 23 марта 2011

У меня проблема с быстрым функционированием ajax и . Вот псевдо / прототип кода:

function blah1(arg1){//arg1 is an array, roughly 10 elements

var arr[];

$.each(arg1, function(i){
//blah code

    $.ajax({
        //blah options
        async:   true,
        success: function(data){
            arr[i] = data.someInt;
        }//end success
    });//end ajax
}//end each

return arr;
}//end function

По сути, я отправляю ajax и мне нужны возвращенные данные для дальнейшей обработки.

Если я установлю async в true, функция немедленно вернет пустой массив 'arr', поэтому весь скрипт завершится неудачно. Но если я установил async в false, это сработает, но займет очень много времени.

Я видел эту $. AjaxQueue (); вещь, но, честно говоря, я ее вообще не понимаю и не знаю, сработает ли она.

Таким образом, вопрос, во-первых, есть ли способ, которым я могу асинхронно отправлять все запросы AJAX одновременно и позволить функции ждать и возвращать arr [] после того, как все AJAX выполнены? Если нет, сработает ли ajaxQueue в моем случае? (грубый пример, пожалуйста?)

Ответы [ 2 ]

5 голосов
/ 23 марта 2011

Используя jQuery 1.5 deferred's, я бы выбрал это:

function blah1(arr, callback){
    $.when($.map(arr, function(val, i){
        $.ajax({
            //blah options
            async:   true
        });
    }).toArray()).then(function(resultsArr) {
         callback(resultsArr);
    });
}

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

То, что вы делаете здесь, это сопоставление массива объектов с объектами jqXHR (которые являются отложенными объектами). Затем передача этого массива отложенных объектов в $.when.

$.when принимает массив, а затем позволяет запустить функцию .then, когда весь массив завершит загрузку из вызовов ajax. Затем в качестве аргумента функции .then передается resultsArr.

Невозможно использовать $.ajax и return в одной и той же функции, если вы манипулируете возвращаемым значением в своем успешном вызове ajax.

4 голосов
/ 23 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...