此代码显示问题(OBS:在脚本所在的目录中需要一个名为text-file.txt
的文件):
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 :(得分: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();
当然,在可写流的情况下,它将是可写的,直到您结束流,它不是一个正在读取的文件将被完成,您确定何时完成后写入并完成它。< / p>
根据您的了解,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();