Node.js 为什么在流API的.write()方法中需要回调?
这个问题涉及node.js流API的Writable.write方法中的回调 我正在学习node.js streams,使用stream adventure,它本质上是一个针对streams的交互式教程。问题之一是将process.stdin通过管道传输到调用Node.js 为什么在流API的.write()方法中需要回调?,node.js,node-streams,Node.js,Node Streams,这个问题涉及node.js流API的Writable.write方法中的回调 我正在学习node.js streams,使用stream adventure,它本质上是一个针对streams的交互式教程。问题之一是将process.stdin通过管道传输到调用console.log('writing'+chunk)的自定义可写流。我第一次尝试的解决方案是: const {Writable} = require('stream'); const writer = new Writable({
console.log('writing'+chunk)
的自定义可写流。我第一次尝试的解决方案是:
const {Writable} = require('stream');
const writer = new Writable({
write(chunk){
console.log('writing: ' + chunk);
}
})
process.stdin.pipe(writer);
输出(此行为是stream adventure执行的测试的内部行为)为:
我意识到使用流冒险会混淆这个问题,所以请容忍我。流没有为下一次写入正确重置。在线查看示例后,我使用以下方法解决了问题:
const { stdin } = require('process');
const {Writable} = require('stream');
const writer = new Writable({
write(chunk, encoding, next){
console.log('writing: ' + chunk);
next();
}
})
process.stdin.pipe(writer);
这里唯一真正的区别是在写操作结束时执行回调。然而,我不知道为什么会这样。查看可写类API,编码和回调都是可选的。可能Readable.pipe方法正在向传递一些回调,但我在文档中找不到它。node.js在第一种情况下做了什么导致流停止,为什么在.write()中执行回调可以解决问题?看起来我被内部
\u write()
方法和公共write()
方法之间的差异搞糊涂了。一般来说,write()
方法确实不需要回调,\u write()
需要回调\u write()
使用回调指示流已完成当前块的处理
节点API建议在创建可写流的新实例时,向对象提供\u write()
,\u writev()
,\u final()
方法。但是,当我实例化流时,我提供了write()
方法。有趣的是,API文档将这种形式的流构造称为“简化”构造
const { Writable } = require('stream');
const myWritable = new Writable({
write(chunk, encoding, callback) {
// ...
}
});
请注意,上面的列表现在不再显示回调是可选的。我怀疑(但尚未确认)此语法会自动将\u write()
设置为匹配write()
。最终这意味着我没有调用回调来表示块处理的结束,因此可写流从未尝试处理下一个块
const { Writable } = require('stream');
const myWritable = new Writable({
write(chunk, encoding, callback) {
// ...
}
});