我经常听说Streams2和古老的streams,但是Streams3是什么呢?It get mentioned in this talk by Thorsten Lorenz

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

在谷歌上搜索的时候,我也看到了Changelog of Node 0.11.5条,

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

推荐答案

我要试一试,但我可能弄错了.我从未写过Streams1(旧流)或Streams2,我可能不是回答这个问题的合适人选,但现在我来回答.似乎有一个Streams1 API在某种程度上仍然存在.在Streams2中,有两种流模式flowing(传统)和non-flowing.简而言之,支撑流动模式的垫片正在消失.这是message that lead to the patch now called called Streams3

与流程2相同的API,但删除了Flow/old这一令人困惑的模式

  1. 每次调用read()并返回一些数据时,就会触发一个数据事件.
  2. resume()将使其反复调用read().否则,就没有变化.
  3. pause()会让它停止反复拨打read().
  4. pipe(dest)on('data', fn)会自动呼叫resume().
  5. 没有切换到旧模式.只有流淌,停顿了一下.溪流开始暂停.

不幸的是,要很好地理解任何定义Streams3的描述,首先需要理解Streams1和遗留流

Backstory

首先,让我们看看 node V0是什么.10.25关于这两种模式,

Readable streams have two "modes": a flowing mode and a non-flowing mode. When in flowing mode, data is read from the underlying system and provided to your program as fast as possible. In non-flowing mode, you must explicitly call stream.read() to get chunks of data out.Node v0.10.25 Docs

Isaac Z. Schlueter said in November slides I dug up:

流程2

  • "吮吸溪流"
  • 调用read()从源中提取数据,而不是"数据"事件
  • 解决(我们知道的)所有问题

因此,似乎在streams1中,您将创建一个对象并调用.on('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做同样的事情.

Node.js相关问答推荐

promise 所有映射或反对

如何使用jq将依赖项添加到package.json中

nest js控制器方法调用两次

在Android Studio中react 本机构建失败:未正确检测到Node.js版本

根据我的测试,为什么在编写Varint代码方面,NodeJS要比Rust快这么多?

无法从MongoDB文档中保存的对象数组中获取对象的属性

通过PutObjectCommand上传AWS S3 PDF文件,结果为空PDF

DynamoDB 分页数据检索

每秒从套接字传来的数据有哪些存储方式?

如何从名字,中间名,姓氏中获取全名并在结果中搜索匹配?

更新文档数组中的文档 Mongoose

无法通过谷歌Electron 表格 api( node js)中的服务帐户访问写入

为什么在调用数据库调用时我的参数没有定义?

等价于 Node.js 的 Rails 控制台

使用 node.js 执行一个 exe 文件

Node.js + Express:应用程序不会开始监听端口 80

NODEJS 进程信息

Bootstrap 中的 Grunt 依赖冲突

如何从 Node.js 应用程序Ping?

如何创建安全(TLS/SSL)Websocket 服务器