2016-04-27 15 views
0

私は最近、約束をもたらすジェネレータを実行するためにQ.spawn関数を使用し始めました。これは、ストリームのサポートがまだ開始されていないブラウザーではうまくいきますが、ノードの場合はストリームがあります。ジェネレータ関数内でストリームを使用していて、ライターストリームが完了すると、コードがきれいになることはありません。ジェネレータ関数でストリームを生成する

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

これはうまくいきますが、多くのストリームを処理し始めると、コードは実際には醜いものになります。スニペットのように簡単にできますか?

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

答えて

0

あなたはPromiseコンストラクタ内でそのコードのほとんどを配置する必要がありません。

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

そしてもちろん、あなたがストリームの多くを待っているならば、それはアウト考慮に理にかなってヘルパー関数への約束コンストラクタ呼び出し:

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

わかりました、しかし、私が本当に知りたいのは、ストリームを生成することも可能であるかどうかで、ランナーはその後、暗黙的にpromiにストリームを変換し、 se。私が直面している問題は 'someStream.pipe(outStream).on( 'end'、=> resolve())'は約束を解決していないようです。私はnodejsストリームが初めてです。 – Ajinkya

+0

BluebirdのようにQが拡張可能だとは思わない。 stream.prototype'を 'then'メソッドで拡張してストリームを作成可能にすることができます。これは' yield'されるはずですが、それが良い方法かどうかは分かりません。 – Bergi

関連する問題