7

asyncjsのウォーターフォール関数のチェーンから関数をジャンプしたいnodejs

私のコードは次のようになります:

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();
}

バイパスしたい関数です。

ありがとう !

4

5 に答える 5

8

別の方法は次のとおりです。

var tasks = [f1];

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

tasks.push(f3);

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

ここf1で、、、f2およびf3は関数です。

それ以外の場合は、明示的に実行する方が適切です。コードを過度に複雑にすることは避けてください。通常は、単純な方が適切です。

アップデート:

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
});
于 2013-03-14T21:02:10.683 に答える
8

私はこれがうまくいくと思います:

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)でこれを推奨しています

于 2014-08-14T05:48:49.677 に答える
1

if-asyncモジュールを使用すると、コードは次のようになります。

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

于 2015-01-29T00:35:42.517 に答える
0

私は答えるのが遅いですが、async-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);
于 2017-09-26T07:09:41.170 に答える
-4

非同期呼び出しを処理するときに作業を非常に簡単にする素晴らしいコア非同期ライブラリを備えたclojurescriptを使用することをお勧めします。

あなたの場合、あなたはこのようなものを書くでしょう:

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

go本体を非同期で実行させるマクロと<!、非同期関数が返されるまでブロックする関数に注意してください。

コードは最初に最初の非同期関数をブロックします。次に、その結​​果がtrueの場合、そのブロックでも2番目の非同期関数を実行します。最後に、3番目の非同期関数を実行してブロックします。

于 2015-08-27T13:36:18.547 に答える