2016-04-28 13 views
0

以下のコードに関して、私の目標はFOR LOOP Bから抜け出し、FOR LOOP Aを続けることですが、コールバック関数内で行います。Node.jsのコールバック関数内の "for"ループを中断する

for(var a of arrA) { 
    // ... 
    // ... 

    for(var b of arrB) { 
     // ... 
     // ... 

     PartService.getPart(a.id, function(err, returnObj) { 
      break; 
     }); 
    } 
} 

これは私に必要な結果を与えるでしょうか?もしそうでなければ、これをどのように達成できますか?


EDIT 4/28/16午前3時28分MST

  • コールバック関数は変更せずに、以下の回答や、すべてのコメントの一つに基づいて

実際には非同期でありますどのようにしてNode.jsに同期コールバック関数を実装するのですか?私はループのために私のコードをリファクタリングすることを検討していますが、まだ同期コールバック関数を使ってこの方向に進むことができるかどうかは不思議です。 Underscore.jsは同期コールバック関数を使用していますが、実装方法はわかりません。

+1

「これで私の望む結果が得られますか?」 - あなたはそれを試しましたか? – Quentin

+2

'PartService.getPart'が最初にコールバックを取るのはなぜですか?それは非同期ですか? – Quentin

+3

'break'はループ内にしかありません。コールバックは新しい境界を導入するので、 'for'ループの内側では考慮されません。また、コールバックが実行される前に両方のループが完了して実行されます(非同期であると仮定して)。ループは同期的であるため、非同期コード(体内で)がうまく再生されません。 JavaScriptで非同期コードフローの詳細を最初に読んでおくと便利でしょう。 –

答えて

2

このようなことを試すことはできますが、コールバックが同期して発生した場合にのみ動作します。

for(var a of arrA) { 
    let shouldBreak = false; 
    for(var b of arrB) { 
    if (shouldBreak) 
     break; 
    // rest of code 
    PartService.getPart(a.id, function(err, returnObj) { // when the callback is called immediately it will work, if it's called later, it's unlikely to work 
     shouldBreak = true; 
    }); 
+1

非同期でない場合、関数がコールバックを必要とするのはなぜですか? – alexmac

+2

@Alexander: '.sort'、' .map'、 '.forEach'、' .filter'はすべて "コールバック"を取りますが、非同期ではありません。しかし、ええ、この関数の命名/構造は、それが非同期であることを示すようです。 –

+0

@FelixKlingはい、あなたは正しいです、私は私の質問をかなり正しく定式化していません。 – alexmac

0

この結果、期待した結果が得られない場合があります。イベントEventEmitterまたはasyncモジュールを使用できます。

関連する問題