2016-03-21 13 views
0

Ich habe mit Node.js Streams für die letzten 6 Monate oder so gearbeitet, und ich war wirklich sehr glücklich mit ihnen bisher. All die Probleme, die ich bisher erlebt habe, konnte ich für die Verwendung der Standardvorlage lösen:Chaining Node.js Streams mit Laufzeitlogik

A.pipe(B).pipe(C); 

erfordert jedoch meine aktuellen Probleme unterschiedliche Strom „Pipelines“, basierend auf Laufzeitlogik verketten. Zum Beispiel, was ich möchte, ist etwas wie das Folgende:

var basePipeline = A.pipe(B).pipe(C); 
if(flowRate > 0.0) { 
    basePipeline.pipe(D).pipe(E).pipe(F); 
} else { 
    basePipeline.pipe(G).pipe(H).pipe(I); 
} 

Ist das obige möglich? Oder, muss ich beide Ströme getrennt in einer vollständigen Art und Weise erstellen:

if(flowRate > 0.0) { 
    A.pipe(B).pipe(C).pipe(D).pipe(E).pipe(F); 
} else { 
    A.pipe(B).pipe(C).pipe(G).pipe(H).pipe(I); 
} 

Vielen Dank für den Hinweis!

+0

Aufgrund der Art, wie die Rohrfunktion zurückkehrt, sollten Sie in der Lage sein, sie so zu verketten. Weil die Funktion pipe(). Pipe() funktioniert, weil die zweite Pipe vom Rückgabewert der ersten Pipe abläuft. Wenn Sie stattdessen diesen Rückgabewert speichern, funktioniert sie genauso, wenn Sie am Ende ein Pipe einfügen. – Binvention

Antwort

1

Sie können immer alle Streams übergeben, Aber Sie behalten ein Array, das speichert, wenn dieser Schritt ausgeführt oder übersprungen werden muss. Beispiel:

wenn die Pfeife wie dieses ist A -> B -> C -> D -> E -> F -> H

und Sie haben eine Hash-

A:0 
B:1 
C:0 
D:1 
... 
... 

das bedeutet Sie nur Rohre laufen B und D.

Am Rohr beginnen Sie prüfen, ob Stromrohr in der Hash ist

// step B 
pipe(function(data)){ 
    if(steps['B'] === 1){ 
     // do something 
    } 
} 

Mit diesem Ansatz haben Sie feste Rohre, aber Sie können im laufenden Betrieb den Durchfluss ändern.