Node.js 在事件循环迭代期间刷新NodeJS流

Node.js 在事件循环迭代期间刷新NodeJS流,node.js,event-loop,nodejs-stream,Node.js,Event Loop,Nodejs Stream,我正在尝试将一个Axios响应流传输到多个文件中。它不工作,我可以用下面的简单代码重现它: 将工作: const { PassThrough } = require('stream') const inputStream = new PassThrough() inputStream.write('foo') // Now I have a stream with content inputStream.pipe(process.stdout) inputStream.pipe(process

我正在尝试将一个Axios响应流传输到多个文件中。它不工作,我可以用下面的简单代码重现它:

将工作:

const { PassThrough } = require('stream')
const inputStream = new PassThrough()
inputStream.write('foo')
// Now I have a stream with content

inputStream.pipe(process.stdout)
inputStream.pipe(process.stderr)
// will print 'foofoo', for both stdout and stderr
不起作用:

const { PassThrough } = require('stream')
const inputStream = new PassThrough()
inputStream.write('foo')

inputStream.pipe(process.stdout)
setImmediate(() => {
    inputStream.pipe(process.stderr)
})
// Will print only 'foo'
问题是,我是否可以说,仅当两个
pipe
命令将在同一事件循环迭代中执行时,流中的现有内容才会被管道传输


这难道不会使情况变得不确定吗?

在执行使用
setImmediate
计划的回调时,流数据已经刷新。这可以通过流属性进行检查

您可以使用和来控制何时刷新缓冲流数据

const { PassThrough } = require('stream')
const inputStream = new PassThrough()
inputStream.cork()
inputStream.write('foo')
inputStream.pipe(process.stdout)
setImmediate(() => {
  inputStream.pipe(process.stderr)
  inputStream.uncork()
})

执行使用
setImmediate
计划的回调时,流数据已经刷新。这可以通过流属性进行检查

您可以使用和来控制何时刷新缓冲流数据

const { PassThrough } = require('stream')
const inputStream = new PassThrough()
inputStream.cork()
inputStream.write('foo')
inputStream.pipe(process.stdout)
setImmediate(() => {
  inputStream.pipe(process.stderr)
  inputStream.uncork()
})