Подождать, пока все запросы jquery ajax будут выполнены? (часть 2)

Я проверил этот пост, и ответ действительно хорош: Подождите, пока все jQuery Ajax запросы выполнены?

Но я просто хочу быть более общим: интересно, как мы можем использовать эту логику для списка сервисов (ajaxservices) и списка обратных вызовов, например.

ajaxservices = ["url-getdata1", "url-getdata2"];
callbacks = [callbackdata1, callbackdata2];
callbackdata1 = function (data){...}

$.when(/*somehow call all ajaxservices[]*/).done(function (dataList) {
            for (var i = 0; i < callbacks.length; i++) {
                callbacks[i](dataList???[i][0]);/* somehow pass the data as parameter*/
            }

        });

Спасибо!

Дополнительная информация: http://api.jquery.com/jQuery.when/


person Jaider    schedule 24.10.2013    source источник
comment
... перебирать URL-адреса, создавая объект обещания для каждого, а затем применять это к $.when?   -  person Kevin B    schedule 24.10.2013


Ответы (2)


Используйте не eval, а apply метод функций который принимает массив аргументов для вызова функции с:

var ajaxservices = ["url-getdata1", "url-getdata2"],
    callbacks = [callbackdata1, callbackdata2];
// assuming a function "callAjax()" that takes an url and returns a promise

var promises = $.map(ajaxservices, callAjax); // loop and generate array

$.when.apply($, promises).done(function () {
    for (var i = 0; i < callbacks.length; i++) {
        callbacks[i].apply(null, arguments[i]);
    }
});
person Bergi    schedule 25.10.2013
comment
Мне нравится ваш ответ, но в моем коде я использую аргументы без .apply(...) и работает! например callbacks[i](arguments[i]) - person Jaider; 25.10.2013
comment
Ваша функция callbacks не смотрит на свои параметры, они ожидают массив? - person Bergi; 26.10.2013

* Обновлено - НЕ РАБОТАЛО, КАК Я ОЖИДАЛ (см. реальное решение ниже)

Неудачный подход

Я нашел выход, используя eval... он не полностью протестирован, но кажется, что все в порядке. Пожалуйста, не стесняйтесь публиковать свои комментарии/компромисс.

callAjax - это метод, который получает URL-адрес и возвращает обещание, такое как return $.ajax(...), но, поскольку я должен выполнить его с помощью оператора .when, я поместил все вызовы в строку, чтобы позже оценить их внутри оператора .when.

convertAjaxCallsToString = function () {
    var result = '';
    for (var i = 0; i < ajaxservices.length; i++) {
        result += "callAjax(ajaxservices[" + i + "])";
        if (i + 1 < ajaxservices.length) {
            result += ",";
        }
    }

    return result;
}

Поскольку я не ожидаю более 10 вызовов ajax, я жестко запрограммировал эти 10 ответов (аргументы 0–9), как вы видите ниже... Если я использую только 3 службы ajax, тогда только 3 аргумента должны иметь значение, а остальные будут undefined и никогда не будет eval, потому что callbacks.length тоже должно быть 3.

var ajaxcalls = _self.convertAjaxCallsToString();

$.when(eval(ajaxcalls)).done(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
    for (var i = 0; i < callbacks.length; i++) {
        //If you expect a page response, Each argument is an array with the following structure: [ data, statusText, jqXHR ]
        var data = eval('arg' + i)[0];
        callbacks[i](data);
    }

});

Возможное решение

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

$.when(ajax(0), ajax(1), ajax(2), ajax(3), ajax(4), ajax(5), ajax(6), ajax(7), ajax(8), ajax(9))
.done(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) {
        for (var i = 0; i < callbacks.length; i++) {
            //If you expect a page response, Each argument is an array with the following structure: [ data, statusText, jqXHR ]
            var data = eval('arg' + i)[0];
            callbacks[i](data);
        }

    });

Если ajax возвращает 0, если нет службы ajax для вызова.

var ajax = function (index) {
            if (index < ajaxservices.length) {
                return callAjax(ajaxservices[index]);
            }

            return 0;
        }
person Jaider    schedule 24.10.2013