一个nodejs stream诡异的行为, 猜测和事件循环有关系, 求解释?

当前目录下准备一个test.txt, 写入一些东西, 比如

>It's for test<

分别执行代码:

  1. 注释掉延时为 3 ms的代码块, 输出dest.txt, 内容为
>It's for test<
  1. 注释掉延时为 2 ms的代码块, 输出dest.txt, 内容为
>It's for test<>It's for test<

以下为代码

const fs = require('fs')
const from = fs.createReadStream('test.txt')
const to = fs.createWriteStream('dest.txt', {
    flags: 'a'
})

from.pipe(to, {
    end: false
})

from.on('end', () => {
    console.log('end')
})

// setTimeout(() => {
//     from.pipe(to)//this won't work, if time >= 3
// }, 3)

// setTimeout(() => {
//     from.pipe(to)//this will work, if time < 3
// }, 2)

只触发end事件一次

不同时间延迟, 输出不同, 行为十分诡异, 求解释?

阅读 599
评论 2019-03-13 提问
    2 个回答

    通过I/O读取字符串到缓冲区

    1. timers阶段没有callback执行,写入WriteStreamtimers阶段检测到callback,执行callback,然鹅ReadStream没数据,pipe没有效果。
    2. timers阶段检测到callback,执行callbackReadStream数据还在,pipe有效果。

    process.stdout测试

    const fs = require('fs')
    const from = fs.createReadStream('test.txt')
    
    from.pipe(process.stdout, {
        end: false
    })
    
    from.on('end', () => {
        console.log('end')
    })
    
    setTimeout(() => {
        console.log('timer callback')
        from.pipe(process.stdout) //this won't work, if time >= 3
    }, 3)
    
    
    // setTimeout(() => {
    //     console.log('timer callback')
    //     from.pipe(process.stdout) //this will work, if time < 3
    // }, 2)
    评论 赞赏

      默认情况下, 在源流发出时stream.end()在目标Writable流上调用,以便目标不再可写。要禁用此默认行为, 可以将该选项作为传递,从而使目标流保持打开状态:

      reader.pipe(writer, { end: false });

      上面说的很清楚了,设置false是保持打开状态,不是你理解的可以一直编辑,也是有时间限制的
      由于Js是异步处理,所有程序同步执行,写入和settimeout也一样,所以当你设置延迟时长高的时候,是没办法注入进去的。
      谢谢

      评论 赞赏
        撰写回答

        登录后参与交流、获取后续更新提醒