Node.js 知道是否可以从中读取可读流
我有一个流在流动模式。在继续与它交互之前,我想检查它是否可读:Node.js 知道是否可以从中读取可读流,node.js,stream,Node.js,Stream,我有一个流在流动模式。在继续与它交互之前,我想检查它是否可读: function do_some_stuff_with_stream(stream) { if (stream.canBeReadFrom()) stream.read(10)... } 换言之,要么是结束,要么是错误发生在眼前。现在,流的工作方式似乎是,每次听end时,它都会被激发(即使它已经结束了,所以我猜可以使用它): 但是,“error”的行为不是这样的,因此如果我收到一个错误流,我将永远坐在那里等
function do_some_stuff_with_stream(stream)
{
if (stream.canBeReadFrom())
stream.read(10)...
}
换言之,要么是结束,要么是错误发生在眼前。现在,流的工作方式似乎是,每次听end时,它都会被激发(即使它已经结束了,所以我猜可以使用它):
但是,“error”的行为不是这样的,因此如果我收到一个错误流,我将永远坐在那里等待,而不是拒绝。假设您正在从流缓冲区数据事件中读取数据,并且使用socket.io streams和node,并假设“可以从中读取”,则表示数据现在可用,并不是说流是字面上可读的类型 ``` ```
在决定使用数据之前,if会检查缓冲区是否为“有效”json字符串。是否尝试检查
stream.readable
?如果它不可读,请立即reject()
。这会随着错误而改变吗?在“结束”发生后,它当然不会变为false。API文档似乎没有提到它,但我认为它是为了区分可写流和可读流(或者两者都可以),而不是让您知道它是否处于可读状态。它应该更改以指示流是否实际可读,而不是指示流的类型。您使用的是什么节点版本?0.10.36以下代码返回true,尽管流中没有数据:var Readable=require('stream')。PassThrough;var-rs=新的可读性;log(rs.readable)new(require('stream').PassThrough)()。readable在0.12中也返回true。所以它似乎只是说“是的,这是一个可读的东西”,而不是“有数据要读”。我也不知道如何模拟一个错误,所以我不知道它是否会变得不可读
function do_some_stuff_with_stream(stream)
{
return new Promise(function(resolve, reject)
{
var data = stream.read(10);
if (data !== null)
resolve(data);
else
{
stream.on("end", reject); // this will happen even if it ended beforehand.
stream.on("readable", function()
{
do_some_stuff_with_stream(stream).then(resolve);
});
}
});
}
cstream.on("data", function (data) {
buffer += data.toString();
if (/^[\],:{}\s]*$/.test(buffer.replace(/\\["\\\/bfnrtu]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
var tdata = JSON.parse(buffer);
//add it to our main stage
drawBiome(worldStage,tdata);
socket.emit("drawBiomeAvatars");
}
});