я был под впечатлением, что поведение async.auto
было то, что если одна из задач возвратила err
, глобальный обратный вызов будет вызван с этой ошибкой и всех последующих задачами будет не выполняется. В конце концов, зачем они? Глобальный обратный вызов был вызван, так что об ошибке уже сообщалось.async.auto: остановить всю цепочку после первой ошибки
Оказалось, что только задачи , которые зависят от неисправной задачи, не будут работать, а остальное будет.
'use strict';
var async = require('async');
async.auto({
downloadAudio: function (callback) {
console.log("downloading audio...");
setTimeout(function() {
console.log("downloaded audio.");
callback();
}, 10000);
},
downloadScript: function (callback) {
console.log("downloading script...");
setTimeout(function() {
return callback(new Error("ERROR downloading script!"));
}, 1000);
},
preprocessAudio: ['downloadAudio', function (callback) {
console.log("preprocessing audio...");
setTimeout(function() {
console.log("done preprocessing audio.");
callback();
}, 5000);
}]
}, function (err) {
if (err) {
return console.error(err.message);
}
console.log('done.');
});
В этом фрагменте кода, как downloadAudio
и downloadScript
сразу работать параллельно, и preprocessAudio
зависит от downloadAudio
. Проблема заключается в том, что, когда downloadScript
возвращает err
, preprocessAudio
все равно будет работать, несмотря на то, что нет никакого смысла, потому что дело не удалось в целом уже:
downloading audio...
downloading script...
ERROR downloading script!
downloaded audio.
preprocessing audio...
done preprocessing audio.
Я знаю, я мог бы сделать preprocessAudio
зависеть от downloadScript
также, но это означает, что что preprocessAudio
будет ждать завершения downloadScript
, хотя они могут работать параллельно без проблем.
Есть ли элегантный способ решить эту проблему?
Спасибо, Jan
Этот вопрос был отмечен как ошибка в это время: https://github.com/caolan/async/issues/1023 –