2016-07-04 26 views
0

Node.jsには、さまざまな場所で発生する再帰呼び出しの戻り値に依存する再帰関数があります。これは小規模のテストケースでも機能しますが、大規模なデータセットを取得すると非同期性が損なわれます。Node.js非同期再帰コールバック

私はコールバックを使用して、それが当たった反復の量は、データセットの長さと一致するかどうかをチェックしようとしましたが、それは何らかの理由ですべてを反復処理する前に停止します(おそらくメモリの問題?)

はここですコールバックへの散発的な呼び出しで、これまでのコードの一般的な流れ、:

function recursiveCall(value, array, callback) { 
    callback(value) 
    if (/*base case*/) { 
     return value; 
    } 

    for (var i = 0; i < array.length; i++) { 

     if (/*conditional*/) { 
      var x = /* work + */ value 
      return recursiveCall(x, array, callback); 
     } 

     . 
     . 
     . 

     if (/*conditional*/) { 
      var x = /* work + */ value 
      return recursiveCall(x, array, callback); 
     } 
    } 
} 

var iters = 0; 
var finalValue = recursiveCall(initialValue, array, function(value) { 
    if (++iters >= array.length) 
     console.log(value); 
}); 

私は終値の値は不定となりますことを理解し、それは小さなテストケースで働いていた元の実装の一部です。

最後に値を記録するだけで済みます。

ありがとうございました!非常に感謝しています!

+2

この部分はどの部分が非同期ですか?それは完全に同期しているようです。 – McMath

+0

あなたのコールバックは再帰的ではありません。 'recursiveCall'の各反復反復で呼び出される無名関数です。あなたの再帰呼び出しは末尾にあるようです。 node.jsまたはその下のクロムエンジンがすでにTCOをサポートしているかどうかはわかりません。たぶんスタックオーバーフローですか? – ftor

答えて

0

これは非同期フローではありません。 recursiveCall関数内でforループを使用しています。ループの非同期化のためのforループは、forloop npmモジュールhttps://www.npmjs.com/package/forloopです。

それとも、forループのない

setInterval(recursiveCall(x, array, callback));

代わりの

return recursiveCall(x, array, callback); を使用することができます。

関連する問題