3

ストリームを引数として関数に渡し、非同期コールバックで使用したいのですが、破棄されます(stream.readableはfalseです)

例えば:

var test = require('./test');
var file = fs.createReadStream('./file.txt');
test(file, console.log);

およびtest.js:

module.exports = function(stream, callback) {
    //stream.pipe(process.stdout); ///////// STREAM IS READABLE HERE 
    doSomething('abc', function(err) {
         stream.pipe(process.stdout); ///////// STREAM IS NOT READABLE HERE
         callback(err);
    });
};
enter code here

なぜこうなった ?
コールバックで使用するにはどうすればよいですか?

4

1 に答える 1

3

これは、ストリームをパイプしようとする前にストリームが終了するために発生します。そもそも、同期コードがまだ機能しているため、ストリームは読み取り可能です。2 番目の場所 (コールバックの内部) では、コールバックが将来数ティック後に実行される可能性があるため、ストリームは既に終了しています。将来それを読みたい場合は、ストリームを一時停止する必要があります。このコードは動作するはずです:

var test = require('./test');
var file = fs.createReadStream('./file.txt');
file.pause();
test(file, console.log);

test.js

module.exports = function(stream, callback) {
    doSomething('abc', function(err) {
         stream.resume();
         stream.pipe(process.stdout);
         callback(err);
    });
};
于 2013-01-28T18:15:37.957 に答える