Я загружаю коллекцию блоков данных с помощью AJAX. Каждый из этих блоков должен быть визуализирован в DOM по порядку, поэтому я запрашиваю первый блок и его рендеринг, затем запрашиваю следующее и так далее до последнего. Когда последний сделано, отложенный объект разрешен сигнализировать другую функцию были загружены все блоки:Множественный успех AJAX на заказ
function loadBlock(block, limit) {
var deferred = $.Deferred();
(function request(block, limit) {
$.ajax({
url: 'block/' + block,
success: function(html) {
$('#block-' + block).html(html);
var nextBlock = block + 1;
if (nextBlock <= limit)
request(nextBlock, limit);
else
deferred.resolve();
}
});
})(block, limit);
return deferred.promise();
}
Однако все это ожидание предыдущего запроса будет завершено может замедлить этот процесс много.
Так что теперь я пытаюсь сделать все запросы как один раз и позволить серверу взять как можно больше, но вместо того, чтобы загружать каждый блок после выполнения соответствующего запроса, я бы хотел, чтобы блок подождал пока не будет загружена предыдущая.
Пример: отправлено 10 запросов. Мы хотели бы сделать блоки по порядку: 1, 2, 3, ... Предположим, что запросы для первых трех блоков завершены в порядке, поэтому блоки загружаются на страницу по мере необходимости, но затем блок 5 готово перед блоком 4, мы хотели бы оставить блок 5 где-то и показать его на странице только после того, как будет сделан блок 4, то есть после выполнения запроса для блока 4 и его визуализации.
Мои вопросы, то есть:
- Как я могу запустить параллельно несколько функций, стреляющие запросы и другие функции, погрузочные блок на странице?
- Как я могу сигнализировать функции загрузки определенного блока, который был сделан предыдущим, чтобы он мог продолжить?
Кроме того, мне нужно будет оставить отложенную логику, потому что мне все еще нужно сигнализировать о завершении всего процесса.
Можете ли вы разработать свой ответ немного больше? Я не вижу, как интегрировать это в моем сценарии. – dabadaba