2013-05-07 23 views
9
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"を出力する次の関数に移動しないような方法がありますか?あなたがエラー引数として真でコールバックした場合nodejsで非同期のシリーズの次の関数の実行を停止する方法はありますか?

+1

'リターンコールバック( '停止')'あなたのシリーズの実行を停止し、 'ERR =「stop''で非同期コールバック関数を呼び出します。 –

+0

これを例に挙げてください。私はその変数(フラグ)がbooltestがリスト内の要素を処理する開始時にどこかで自分自身をリセットしなければならないと仮定してどこに行くのか分からないようです。 – Rolando

答えて

21

流れはとても基本的に

if (booltest) 
    callback(null, 'one'); 
else 
    callback(true); 

が、それは論理的にするために

+0

あなたがコールバックをfalseでコールすると、コールバック(true)...それはどうやってfalseですか? – Rolando

+0

最初の引数 'null'は実際にはあなたのerr引数です。プロセスの実行を停止するには、trueに設定します。それは私の間違いです。申し訳ありません – drinchev

+1

私はそれが適切な設計だとは思わない。最初の引数はエラーです。非同期でコールバックが呼び出された場合は処理が中断されますが、任意の理由で処理を停止する一般的な方法として使用すると、私にとっては変です。 –

1

動作するはずです、あなただけのerrorOrStopのようなものにerrorの名前を変更することができ、停止します。

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

あなたが探している機能はasync.detectではないと思います。 https://github.com/caolan/async#detect

から

(ARR、反復子、コールバック)を検出

は非同期真実試験に合格するARRの最初の値を返します。 イテレータが並列に適用されます。つまり、最初のイテレータが を返すと、その結果で検出コールバックが発生します。つまり、 の結果は、テストに合格した元のarrの最初の項目( の順)ではない可能性があります。

のコード例

async.detect(['file1','file2','file3'], fs.exists, function(result){ 
    // result now equals the first file in the list that exists 
}); 

あなたのbooltestであなたが望む結果を得るためにすることを使用することができます。

0

エラーと機能だけを区別するためにオブジェクトを渡しています。これは次のようになります。その後

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 
     } 

    } 
}); 
関連する問題