Asyncjs:在瀑布链旁路的功能(Asyncjs : Bypass a function in a

2019-08-17 15:20发布

我想从瀑布功能用链条跳转的功能asyncjsnodejs

我的代码如下所示:

async.waterfall([
    function(next){
        if(myBool){
            next(null);
        }else{
            // Bypass the 2nd function
        }
    },

    // I want to bypass this method if myBool is false in the 1st function
    function(next){
    },

    // Always called
    function(next){
    }
]);

你知道正确的方式做到这一点不认沽:

if(!myBool){
    return next();
}

在功能我想绕过。

谢谢 !

Answer 1:

另一种可能是:

var tasks = [f1];

if(myBool){
    tasks.push(f2);
}

tasks.push(f3);

async.waterfall(tasks, function(err, result){
});

其中, f1f2f3是你的职责。

除此之外,你最好还是明确地做这件事,避免使你的代码过于复杂,简单的通常是更好

更新:

function f1(done){
    if(myBool){
        f2(done);
    }else{
        done();
    }
}

function f2(done){
    async.nextTick(function(){
        // stuff
        done();
    });
}

async.waterfall([f1,f3],function(err,result){
    // foo
});


Answer 2:

我想,这应该工作:

var finalCallback = function(err, result){
  if(err)
     // handle error..
  else
     console.log('end! :D');
}

async.waterfall(
  [
    function step1(callback){
       // stuff
       callback(null, someData);
    },
    function step2(someData, callback){
       if(skip_step_3)
          finalCallback(null, someData);
       else
          callback(null, someData);
    },
    function step3(moreData, callback){
       // more stuff
       callback(null, moreData);
    }
  ],
  finalCallback
)

异步的创建者建议更换这在GitHub库( https://github.com/caolan/async/pull/85 )



Answer 3:

使用IF-异步模块的代码如下所示:

var async = require('async')
var ifAsync = require('if-async')

async.waterfall([
    foo,
    ifAsync(p1).then(c1).else(c2),
    bar
], function(err) {})

全例如这里看看: https://github.com/kessler/if-async#example-2-using-with-asyncjs-waterfall



Answer 4:

我来不及回答,但异步的if-else可能会帮助你。

示例代码

 var async = require('async-if-else')(require('async'));

  function emailExists(user, callback) {
    user.find(user.email, function(err, dbUser){
      if (err)
        return callback(error);

      if(!dbUser)
     return callback(null, false); // does not exist, predicate will be false 

   callback(null, true);  
  });
  }

  function updateAccount(user, callback) { 
    user.update( ..., callback);
  }

  function importFromLegacyByEmail(user, callback) { 
    remoteClient.get(user, callback);
  }

  async.waterfall([
    async.constant({email: 'thiago@email.com', dogs: 2, money: 0, fun: 100 }),
    async.if(emailExists, updateAccount).else(importFromLegacyByEmail),
    sendEmail
  ], handler);


Answer 5:

我会建议使用clojurescript它有一个真棒核心异步库异步调用处理时使生活超级简单。

在你的情况,你会写是这样的:

(go
  (when-let [res1 (<! (asyncFunc1))]
    (<! (asyncFunc2 res1)))
  (<! (asyncFunc3)))

注意go的宏,这将导致身体异步运行,以及<! 功能,这将阻塞,直到异步函数将返回。

该代码将在所述第一异步函数第一个块。 然后,如果这个结果是真实的,它会在运行在块中的第二异步功能以及。 最后,它将运行第三异步功能和阻断。



文章来源: Asyncjs : Bypass a function in a waterfall chain