2012-02-07 4 views
0

インライン関数でこのコードは問題(OBS:スクリプトと同じディレクトリにtext-file.txtと呼ばれるファイルが必要)を示しReadableStream可読ない

var fs = require('fs'); 
var http = require('http'); 

var file = fs.createReadStream('text-file.txt'); 
console.log('1:', file.readable); 

var req = http.request({}, function (res) { 
    console.log('2:', file.readable); 
}); 
req.end(); 

その出力である:

1: true 
2: false 

をいずれの場合もtrueではなく、 これはなぜですか?また、コールバック関数内で読み取り可能なReadableStreamを取得するにはどうすればよいですか?

奇妙なことには、次のコードではなく、そこから読み取るのでファイルに書き込む、両方のケースでtrueを返すということです。まあ

var fs = require('fs'); 
var http = require('http'); 

var file = fs.createWriteStream('new-file.txt'); 
console.log('1:', file.writable); 

var req = http.request({}, function (res) { 
    console.log('2:', file.writable); 
}); 
req.end(); 
+0

私はおそらくこれはNode.jsの0.6.10、Linux上の最新の安定版、であることを追加する必要があります。 –

答えて

0

あなたが読めるストリームを作成するとき、それは最初の読み取り可能です。いくつかのデータイベントが発生し、ファイル全体が終了すると、ファイルには何も残っておらず、データイベントもなくなるため、ファイルはもう読み込めません。このデータイベントは、コールバックをバインドするかどうかにかかわらず発生します。ここでは、コールバックが起動されるまでにファイルが終了している可能性が高く、データイベントが残っていないため、もう読み込みできません。

var fs = require('fs'); 
var http = require('http'); 

var file = fs.createReadStream('text-file.txt'); 
console.log('1:', file.readable); 

file.on('data', function(data) { 
    console.log('3:', file.readable, data); //it will fire chunks of the body of file 
}); 

file.on('end', function() { 
    console.log('4:', file.readable); //This means there is no data events anymore, file finished 
}); 

var req = http.request({}, function (res) { 
    console.log('2:', file.readable); 
}); 
req.end(); 

また、ストリームを一時停止し、それが可能な状態になりますので、コールバックでそれを再開することができます。

var fs = require('fs'); 
var http = require('http'); 

var file = fs.createReadStream('text-file.txt'); 
file.pause(); 
console.log('1:', file.readable); 

var req = http.request({}, function (res) { 
    file.resume(); 
    console.log('2:', file.readable); 
}); 
req.end(); 

そして、書き込み可能なストリームの場合は、もちろん、それはあなたがストリームを終了するまでの書き込み可能になりますそれは、読み込まれているファイルではなく、書き終わった時点を判断して書き終えます。

あなたの知る限りでは、TCPは書き込み可能であり、読み終わるまで読むことができます。したがって、データイベントが発生する可能性があります。データイベントは、相手側が書き込みを行い、書き込むときにデータイベントを作成するときに発生します。

だから、技術的にこれはもう書き込み可能ではありません。

var fs = require('fs'); 
var http = require('http'); 

var file = fs.createWriteStream('new-file.txt'); 
console.log('1:', file.writable); 
file.end('I wanna sleep!'); 
console.log('2:', file.writable); 
var req = http.request({}, function (res) { 
    console.log('3:', file.writable); 
}); 
req.end(); 
+0

偉大な、ありがとう! '.pause()'を使うと動作しました。私はちょうどストリームを使用し始めたので、私はそれをキャッチしませんでした。おそらく、私は他の人々のためにそれをクリアするためにドキュメントへのパッチを作ろうとします。 –

+0

Nodeのストリームを理解するまでに時間がかかりました。これらのリンクはあなたを助けるかもしれません:http://docs.nodejitsu.com/articles/advanced/streams –

関連する問題