在内联函数中,ReadableStream不可读

时间:2012-02-07 14:11:04

标签: node.js

此代码显示问题(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();

1 个答案:

答案 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();