Лучшее решение ожидать всех ajax обратных вызовов, которые будут выполняться

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

(function($){
  var sources = ['http://source1.com', 'http://source2.com'],
  guard = 0, 
  someHandler = function() { 
    if (guard != sources.length) { return; }
    //do some actions
  };

  for (var idx in sources) {
    $.getJSON(sources[idx], function(){ guard++; someHandler(); })
  }
})(jQuery)

Что я не люблю, вот то, что в этом случае я не могу обработать сбой ответа (например, Я не могу установить тайм-аут для ответа для прибытия), и общий подход (я предполагаю, что должен быть способ использовать больше питания функционального программирования здесь),

Какие-либо идеи?

С уважением!

UPD: Спасибо за решение с объединением в цепочку обратных вызовов. Я нашел хороший подход here:. это - то, что было предложено в комментариях:

(function hidenext(jq){
    jq.eq(0).fadeOut("fast", function(){
        (jq=jq.slice(1)).length && hidenext(jq);
    });
})($('div#bodyContent a'))

С определенной тонкой настройкой его может ожидать последнего обратного вызова.

Теперь я хочу обработать правильно длительные запросы. Какие-либо подсказки?

9
задан glaz666 28 May 2010 в 11:08
поделиться

4 ответа

Возможно, вы могли бы "каскадировать" загрузки, так что обратный вызов первого getJSON запускает загрузку из следующего источника, и так далее? Тогда в последнем обратном вызове у вас не останется источников и вы сможете вызвать функцию 'done'.

0
ответ дан 5 December 2019 в 02:07
поделиться

Вы всегда можете использовать $.ajax с "async: false" в опциях и/или использовать соответствующие обратные вызовы (beforeSend, error, dataFilter, success и complete).

0
ответ дан 5 December 2019 в 02:07
поделиться

Может быть, я ошибаюсь - но правило гласит: сериализация AJAX - по очереди. Так что вам НАДО выстроить цепочку - каждый ответ (call back function) должен передавать следующий по очереди

*.onreadystatechange даст вам контроль (функция то есть) )когда он будет готов - здесь вы можете передавать следующий по очереди

0
ответ дан 5 December 2019 в 02:07
поделиться

Дубликат javascript: выполнить кучу асинхронных методов с одним обратным вызовом

function createCallback(limit, fn){
    var finishedCalls = 0;
    return function(){
        if (++finishedCalls == limit){
             fn();
        }
    };
}


var callback = createCallback(4, function(){
    alert("woot!");
});


async1(callback);
async2(callback);
async3(callback);
async4(callback);
2
ответ дан 5 December 2019 в 02:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: