有没有办法在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中停止执行异步系列的下一个功能?的主要内容,如果未能解决你的问题,请参考以下文章

为啥说nodejs是异步非阻塞

celery 停止执行中 task

七天学会NodeJS系列教程之异步编程

有没有办法打破Visual Studio中执行的下一行代码?

如何从请求中返回结果,以及在 NodeJS 中执行异步任务但没有回调之后

nodejs事件循环