jQuery Deferred - ожидание завершения нескольких запросов AJAX

jquery jquery-deferred

47656 просмотра

3 ответа

У меня есть трехслойная цепочка отложенных вызовов ajax, и в идеале они собираются выполнить обещание до самого конца, когда закончится самый глубокий слой (заставляет меня задуматься о начале ... «нам нужно идти глубже!»).

Проблема в том, что я отправляю много запросов ajax (возможно, сотни) одновременно и мне нужно отложить до тех пор, пока все они не будут выполнены. Я не могу полагаться на последнее, сделанное последним.

function updateAllNotes() {
    return $.Deferred(function(dfd_uan) {
        getcount = 0;
        getreturn = 0;
        for (i = 0; i <= index.data.length - 1; i++) {
            getcount++;
            $.when(getNote(index.data[i].key)).done(function() {
                // getNote is another deferred
                getreturn++
            });
        };
        // need help here
        // when getreturn == getcount, dfd_uan.resolve()
    }).promise();
};
Автор: brittohalloran Источник Размещён: 12.11.2019 09:51

Ответы (3)


107 плюса

Решение

Вы можете использовать .when()и .apply()с несколькими отложенными. Очень полезно:

function updateAllNotes() {
    var getarray = [],
        i, len;

    for (i = 0, len = data.length; i < len; i += 1) {
        getarray.push(getNote(data[i].key));
    };

    $.when.apply($, getarray).done(function() {
        // do things that need to wait until ALL gets are done
    });
}
Автор: brittohalloran Размещён: 02.07.2011 04:50

27 плюса

Если вы ссылаетесь на jQuery.Whendoc, если один из ваших вызовов ajax завершится неудачно, failбудет вызван главный обратный вызов, даже если все последующие вызовы ajax еще не завершены. В этом случае вы не уверены, что все ваши звонки завершены.

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

$.when.apply($, $.map(data, function(i) {
    var dfd = $.Deferred();
    // you can add .done and .fail if you want to keep track of each results individualy
    getNote(i.key).always(function() { dfd.resolve(); });
    return dfd.promise();
});
Автор: Mordhak Размещён: 29.11.2012 02:08

7 плюса

Спасибо за ответ brittohalloran. Я также использую Underscore, поэтому я смог очень аккуратно применить ваше решение с картой, вроде этого:

$.when.apply($, _.map(data, function(i) {
    return getNote(i.key);
})).done(function() {
    alert('Be Happy');
});

Злой полезен.

Автор: Travis Размещён: 06.08.2012 10:10
Вопросы из категории :
32x32