Лучшее решение для ожидания всех обратных вызовов ajax - PullRequest
9 голосов
/ 28 мая 2010

Представьте себе, что мы должны запрашивать у 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: Спасибо за решение с цепочкой обратных вызовов. Я нашел хороший подход здесь :. вот что было предложено в комментариях:

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

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

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

Ответы [ 4 ]

2 голосов
/ 28 мая 2010

Дубликат 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);
0 голосов
/ 28 мая 2010

Возможно я ошибаюсь - но правило таково: сериализация AJAX - по одному за раз Таким образом, вы ДОЛЖНЫ связать его - каждый ответ (функция обратного вызова) должен отправить следующий по очереди

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

0 голосов
/ 28 мая 2010

Может быть, вы могли бы «каскадировать» загрузки, поэтому обратный вызов первой загрузки getJSON инициирует загрузку из следующего источника и так далее? Затем в последнем обратном вызове у вас не осталось источников, и вы можете вызвать вашу функцию «готово».

0 голосов
/ 28 мая 2010

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

...