Node.js中的Streams3是什么?它与Streams2有何不同?

Node.js中的Streams3是什么?它与Streams2有何不同?,node.js,stream,Node.js,Stream,我经常听说Streams2和古老的streams,但Streams3是什么 我在哪里可以读到它,Streams2和Streams3之间的区别是什么 在谷歌上搜索,我也看到了 流:简化流动、被动数据侦听(streams3)(isaacs) 我要试一试,但我可能弄错了。我从来没有写过Streams1(旧流)或Streams2,我可能不是回答这个问题的合适人选,但现在我来回答。似乎在某种程度上仍然存在Streams1API。在Streams2中,有两种流模式:流动(传统)和非流动。简言之,支撑流动模式

我经常听说Streams2和古老的streams,但Streams3是什么

我在哪里可以读到它,Streams2和Streams3之间的区别是什么

在谷歌上搜索,我也看到了

流:简化流动、被动数据侦听(streams3)(isaacs)


我要试一试,但我可能弄错了。我从来没有写过Streams1(旧流)或Streams2,我可能不是回答这个问题的合适人选,但现在我来回答。似乎在某种程度上仍然存在Streams1API。在Streams2中,有两种流模式:流动(传统)和非流动。简言之,支撑流动模式的垫片正在消失。这是,

与streams2相同的API,但删除了Flow/old这一令人困惑的模式 模式开关

  • 每次调用
    read()
    并返回一些数据时,都会触发一个数据事件
  • resume()
    将使其重复调用read()。否则,就没有变化
  • pause()
    将使其停止反复调用
    read()
  • pipe(dest)
    on('data',fn)
    将自动调用
    resume()
  • 没有切换到旧模式。只有流淌,停了下来。溪流开始暂停
  • 不幸的是,要很好地理解定义Streams3的任何描述,您需要首先理解Streams1和遗留流

    背景故事

    首先,让我们看一下节点V0.1025文档中关于这两种模式,

    可读流有两种“模式”:流动模式和非流动模式。在流动模式下,数据从底层系统读取,并尽快提供给程序。在非流动模式下,必须显式调用stream.read()以取出数据块。-

    :

    流程2

    • “吸溪”
    • 调用read()从源中提取数据,而不是“数据”事件的溢出
    • 解决(我们知道的)所有问题
    因此,似乎在streams1中,您将创建一个对象并调用('data',cb)到该对象。这会将事件设置为触发器,然后您就任由流支配了。在Streams2中,流内部有缓冲区,您可以显式地(使用“.read”)从这些流请求数据。Isaac继续指定向后兼容如何在Streams2中工作,以保持Streams1(旧流)模块正常工作

    旧模式流1垫片

    • 新的数据流可以切换到旧模式,在旧模式下,它们会喷出“数据”
    • 如果添加“数据”事件处理程序,或调用pause()或resume(),则切换
    • 对现有测试进行最小的更改以保持诚实
    因此,在Streams2中,调用
    .pause()
    .resume()
    会触发垫片。而且,它应该,对吗?在Streams2中,您可以控制何时
    .read()
    ,并且不会捕捉到向您扔来的东西。这触发了独立于Streams2的传统模式

    让我们以艾萨克的幻灯片为例

    createServer(function(q,s) {
      // ADVISORY only!
      q.pause()
      session(q, function(ses) {
        q.on('data', handler)
        q.resume()
      })
    })
    
    • 在Streams1中,
      q
      立即开始读取和发出(可能丢失数据),直到调用
      q.pause
      建议
      q
      停止拉入数据,但不要发出事件以清除已读取的内容
    • 在Streams2中,
      q
      开始暂停,直到调用
      .pause()
      表示模拟旧模式
    • 在Streams3中,
      q
      以暂停开始,因为从未从文件句柄读取使
      q.pause()
      成为noop的文件句柄,并且在调用
      q.on('data')时,cb
      将调用
      q.resume
      ,直到缓冲区中没有更多数据。然后再次打电话给q.resume,做同样的事情

    我建议您阅读文档,更具体地说是“流消费者的API”一节,这实际上是很容易理解的,而且我认为另一个答案是错误的:

    似乎Streams3是在io.js中引入的,然后是在Node 0.11中引入的+

    Streams 1支持将数据推送到流。没有消费者控制,数据被抛出消费者,无论它是否准备好

    Streams 2允许按照Streams 1将数据推送到流中,或者允许消费者根据需要从流中提取数据。使用者可以在pull模式下控制数据流(在通知可用数据时使用stream.read()。流不能同时支持推和拉

    Streams 3允许在同一个流上拉入和推送数据

    这里有一个很好的概述:


    这里有一个缓存版本(于2020年8月访问):

    我认为您的第一个要点是错误的。调用read()根本不会触发事件,流仍处于暂停模式,您可以根据请求获取尽可能多的字节。仅向“data”事件添加处理程序即可将流切换到流动模式,您将开始获取数据事件,直到完成为止。引用的链接已失效。有关Stream1、2和3的精彩文章: