Изчакайте, докато всички 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 отговора (arg 0 - 9), както виждате по-долу... Ако използвам само 3 ajax услуги, тогава само 3 arg трябва да имат стойност, а другите ще бъдат 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