2016-04-27 3 views
0

Ich habe vor kurzem angefangen, Q.spawn Funktion zu verwenden, um Generatoren zu laufen, die Versprechen versprechen. Dies funktioniert gut in Browsern, in denen die Unterstützung für Streams noch nicht gelandet ist, aber im Fall von Knoten haben wir Streams. Wenn Sie Streams in einer Generatorfunktion verwenden und nach dem Erstellen des Writer-Streams einen Ertrag erzielen möchten, wird Ihr Code nicht mehr so ​​sauber.Ergiebige Ströme in Generatorfunktionen

Q.spawn(function*() { 
    yield new Promise(resolve => { 
    let fromStream = fs.createReadStream('x.txt'); 
    let toStream = fs.createWriteStream('y.txt'); 

    toStream.on('end',() => resolve()); 
    fromStream.pipe(toStream); 
    }); 
}); 

Es funktioniert, aber sobald ich anfange, mit vielen Streams zu handeln, wird der Code wirklich hässlich. Kann dies so einfach wie das folgende Snippet gemacht werden ?.

someGeneratorFuncRunner(function*() { 
    yield fs.createReadStream('x.txt') 
      .pipe(fs.createWriteStream('y.txt')); 
}); 

Antwort

0

Sie brauchen nicht in der Promise Konstruktor die meisten dieser Code zu setzen:

Q.spawn(function*() { 
    let fromStream = fs.createReadStream('x.txt'); 
    let toStream = fs.createWriteStream('y.txt'); 

    fromStream.pipe(toStream); 
    yield new Promise(resolve => { 
    toStream.on('end', resolve); 
    }); 
}); 

Und natürlich, wenn Sie für viele Streams darauf warten, wäre es sinnvoll, um Faktor das Versprechen Konstruktoraufruf in eine Hilfsfunktion:

function endOf(stream) { 
    return new Promise(resolve => { 
    stream.on('end', resolve); 
    }); 
} 
+0

okay, aber was ich wirklich wissen wollen, ist, ob es möglich ist, einen Strom und den Läufer wandelt dann implizit den Strom in ein promi zu ergeben se. Das Problem, dem ich gegenüberstehe, ist 'someStream.pipe (outStream) .on ('end', => resolve())' scheint das Versprechen nicht zu lösen. Ich bin neu in Nodejs Streams. – Ajinkya

+0

Ich denke nicht, dass Q in dieser Hinsicht erweiterbar ist wie Bluebird. Man könnte den eingebauten 'Stream.prototype' mit einer' then'-Methode erweitern, um Streams zu machen, die dann "rised" werden können, aber ich bin mir nicht sicher, ob das eine gute Übung wäre. – Bergi

Verwandte Themen