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

jquery jquery-deferred

47656 просмотра

3 ответа

2339 Репутация автора

У меня есть трехслойная цепочка отложенных вызовов 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 Источник Размещён: 30.06.2011 05:08

Ответы (3)


107 плюса

2339 Репутация автора

Решение

Вы можете использовать .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

7 плюса

1393 Репутация автора

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

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

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

Автор: Travis Размещён: 06.08.2012 10:10

27 плюса

2396 Репутация автора

Если вы ссылаетесь на 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
Вопросы из категории :
32x32