有没有办法在nodejs中停止执行异步系列的下一个功能?
Posted
技术标签:
【中文标题】有没有办法在nodejs中停止执行异步系列的下一个功能?【英文标题】:Is there a way to stop execution of next function of series with async in nodejs? 【发布时间】:2013-05-01 16:01:04 【问题描述】: async.map(list, function(object, callback)
async.series([
function(callback)
console.log("1");
var booltest = false;
// assuming some logic is performed that may or may not change booltest
if(booltest)
// finish this current function, move on to next function in series
else
// stop here and just die, dont move on to the next function in the series
callback(null, 'one');
,
function(callback)
console.log("2");
callback(null, 'two');
],
function(err, done)
);
);
是否有某种方法可以使如果 function1 如果 booltest 评估为 true,则不要继续执行下一个输出“2”的函数?
【问题讨论】:
return callback('stop')
将停止执行您的系列并使用 err = 'stop'
调用异步回调函数。
你能举个例子吗?我似乎不知道该变量(标志)会去哪里假设 booltest 必须在开始处理列表中的元素时在某处重置。
【参考方案1】:
如果您使用 true 作为错误参数进行回调,流程将停止,所以基本上
if (booltest)
callback(null, 'one');
else
callback(true);
应该有效
【讨论】:
当你说回调是假的,但回调(真)......那怎么是假的? 那么你的第一个参数'null'实际上是你的错误参数。只需将其设置为 true,即可停止执行您的流程。这是我的错。对不起 我认为这不是正确的设计。第一个参数是一个错误。如果调用回调,异步恰好会停止处理,但将其用作出于任意原因停止处理的一般方法对我来说似乎很奇怪。 来自文档:如果系列中的任何函数将错误传递给其回调,则不再运行任何函数,并且立即使用错误值调用系列的回调。 github.com/caolan/async#series【参考方案2】:我认为您正在寻找的功能是 async.detect 而不是 map。
来自https://github.com/caolan/async#detect
检测(arr,迭代器,回调)
返回 arr 中通过异步真值测试的第一个值。这 迭代器并行应用,这意味着第一个迭代器返回 true 将使用该结果触发检测回调。这意味着 结果可能不是原始 arr 中的第一项(就 顺序)通过测试。
示例代码
async.detect(['file1','file2','file3'], fs.exists, function(result)
// result now equals the first file in the list that exists
);
你可以用你的 booltest 来得到你想要的结果。
【讨论】:
【参考方案3】:为了合乎逻辑,您可以将 error
重命名为 errorOrStop
之类的名称:
var test = [1,2,3];
test.forEach( function(value)
async.series([
function(callback) something1(i, callback) ,
function(callback) something2(i, callback)
],
function(errorOrStop)
if (errorOrStop)
if (errorOrStop instanceof Error) throw errorOrStop;
else return; // stops async for this index of `test`
console.log("done!");
);
);
function something1(i, callback)
var stop = i<2;
callback(stop);
function something2(i, callback)
var error = (i>2) ? new Error("poof") : null;
callback(error);
【讨论】:
【参考方案4】:我正在传递一个对象来区分错误和功能。看起来像:
function logAppStatus(status, cb)
if(status == 'on')
console.log('app is on');
cb(null, status);
else
cb('status' : 'functionality', 'message': 'app is turned off') // <-- object
稍后:
async.waterfall([
getAppStatus,
logAppStatus,
checkStop
], function (error)
if (error)
if(error.status == 'error') // <-- if it's an actual error
console.log(error.message);
else if(error.status == 'functionality') <-- if it's just functionality
return
);
【讨论】:
以上是关于有没有办法在nodejs中停止执行异步系列的下一个功能?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法打破Visual Studio中执行的下一行代码?