Node.js 为什么在流API的.write()方法中需要回调?

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({

这个问题涉及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({
  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) {
    // ...
  }
});