2016-07-04 21 views
0

Ich habe eine rekursive Funktion in Node.js, die von dem Rückgabewert seiner rekursiven Aufrufe abhängt, die an verschiedenen Stellen auftreten können. Es funktioniert für kleinere Testfälle, aber sobald ich zu meinen größeren Datensätzen komme, vermasselt Asynchronität es.Node.js Asynchrone rekursive Callbacks

Ich habe versucht, einen Rückruf verwenden und prüfen, ob die Menge an Iterationen trifft es die Länge des Datensatzes übereinstimmt, aber es stoppt, bevor es alle aus irgendeinem Grund Iterieren durch (möglicherweise Speicherproblem?)

Hier der allgemeine Ablauf des Codes, so weit, mit sporadischen Anrufen Rückruf:

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

ich verstehe, dass der Wert der Endwert nicht definiert sein, aber es ist ein Teil der ursprünglichen Implementierung, die mit dem kleineren Testfall gearbeitet.

Ich muss nur in der Lage sein, den Wert am Ende zu protokollieren.

Vielen Dank für die Hilfe! Es wird sehr geschätzt!

+2

Welcher Teil davon ist asynchron? Es scheint völlig synchron zu sein. – McMath

+0

Ihr Rückruf ist nicht rekursiv. Es ist nur eine anonyme Funktion, die bei jeder rekursiven Iteration von 'rekursivem Ruf' aufgerufen wird. Ihre rekursiven Aufrufe scheinen in Endposition zu sein. Ich weiß nicht, ob node.js oder die zugrunde liegende Chrome-Engine bereits TCO unterstützt. Vielleicht ist es ein Stapelüberlauf? – ftor

Antwort

0

Dies ist kein asynchroner Fluss. Sie verwenden die for recople innerhalb der rekursiven Call-Funktion. Alternativ der for-Schleife, um die Schleife asynchron zu machen, ist forloop ein npm-Modul https://www.npmjs.com/package/forloop.

Oder Sie verwenden

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

statt

return recursiveCall(x, array, callback); ohne Schleife.