#javascript #task-queue
#javascript #очередь задач
Вопрос:
Я хотел бы использовать queue для выполнения длинного списка асинхронных задач. Я пробовал, как в документации (https://github.com/mbostock/queue ):
var q = queue(1);
tasks.forEach(function(t) { q.defer(t); });
q.awaitAll(function(error, results) { console.log("all done!"); });
но в моем случае этот код выполняет только первую задачу, а awaitAll
функция никогда не запускается. Если я удалю параметр queue, оставив просто queue()
, что означает бесконечный параллелизм, все задачи выполняются как ожидалось, но awaitAll
метод не запускается.
Я выполнил другие тесты, используя следующий код:
var q = queue(2); // With or without the parallelism
for (var i = 0; i < 5; i ) q.defer(function (x) {$("#test" x).text(x);}, i);
q.awaitAll(function (error, results) {alert("all done!");});
Вы можете поиграть с этим кодом здесь:http://jsfiddle.net/6p9Vz / (если вы оставите число n
для параллелизма при вызове очереди, изменится только содержимое первого n
div. Предупреждение никогда не появляется).
Я открыл исходный код очереди, и проблема, похоже, связана с callback(i)
функцией, которая вызывается не во всех случаях, и, следовательно, active
счетчик никогда не уменьшается. Может быть, проблема в аргументах, переданных defer()
?
Ответ №1:
Ваши отложенные функции должны принимать callback
аргумент и вызывать его по завершении задачи с двумя аргументами: error
(если есть) и результатом выполнения задачи.
Вот пример из readme
function simpleTask(callback) { // note the callback argument
setTimeout(function() {
callback(null, {answer: 42}); // invoking the callback to indicate task completion
}, 250);
}
Комментарии:
1. Спасибо за ваш ответ. На самом деле, я уже пробовал это решение. Однако в моем конкретном случае каждая задача запускает цепочку функций, поэтому на этом этапе очень сложно установить обратный вызов, особенно для результата выполнения.
2. Что ж, вам нужно знать, когда задача завершается, чтобы действовать в соответствии с ней.