async.auto:第一个错误后停止整个链

我的印象是, async.auto的行为是,如果其中一个任务返回一个err ,全局callback将被调用这个错误, 所有后续的任务将不会执行。 毕竟,他们为什么呢? 全局callback已被调用,所以错误已被报告。

事实certificate,只有依赖于错误任务的任务才会运行,其余部分将会运行。

 '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.'); }); 

在这个代码片段中, downloadAudiodownloadScript将立即运行并且preprocessAudio取决于downloadAudio 。 问题是,当downloadScript返回一个errpreprocessAudio仍然会运行,即使没有意义,因为事情已经失败了:

 downloading audio... downloading script... ERROR downloading script! downloaded audio. preprocessing audio... done preprocessing audio. 

我知道,我可以使preprocessAudio取决于downloadScript也意味着preprocessAudio将等待downloadScript完成,即使他们可以并行运行没有问题。

有没有什么优雅的方法来解决这个问题?

谢谢,Jan

鉴于此,如果downloadScript已经返回错误,您不希望预处理audio运行,则预处理audio确实会“依赖”其他两个函数。

只需添加依赖关系,所有应该正常工作。

 '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', 'downloadScript', 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.'); });