Предположите, что мы имеем к источникам, которые будет требовать 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'))
С определенной тонкой настройкой его может ожидать последнего обратного вызова.
Теперь я хочу обработать правильно длительные запросы. Какие-либо подсказки?
Возможно, вы могли бы "каскадировать" загрузки, так что обратный вызов первого getJSON запускает загрузку из следующего источника, и так далее? Тогда в последнем обратном вызове у вас не останется источников и вы сможете вызвать функцию 'done'.
Вы всегда можете использовать $.ajax с "async: false" в опциях и/или использовать соответствующие обратные вызовы (beforeSend, error, dataFilter, success и complete).
Может быть, я ошибаюсь - но правило гласит: сериализация AJAX - по очереди. Так что вам НАДО выстроить цепочку - каждый ответ (call back function) должен передавать следующий по очереди
*.onreadystatechange даст вам контроль (функция то есть) )когда он будет готов - здесь вы можете передавать следующий по очереди
Дубликат 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);