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



На этот вопрос уже есть ответ здесь:



У меня есть трехслойная глубокая цепочка отложенных вызовов 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();
};
495   3  

3 ответов:

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

Если вы ссылаетесь на jQuery.When док, если один из ваших вызовов ajax завершится неудачей, fail master callback будет вызван, даже если все последующие вызовы 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();
});

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

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

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

Comments

    Ничего не найдено.