对流程介绍(流)在Node.js
说到流量,它涉及在*nix *nix管道的概念,在壳的流程如|实施(关道付)的桥梁数据的一个过程的输出(stdout)可以直接作为一个过程的输入(stdin)。
在节点中,流的概念与此类似,表示数据流被桥接的能力。
管
流化的本质在于管道()方法,桥接的能力是在管道()方法中桥接数据流的两端(上游/下游或读/写流)。
伪代码的形式如下:
复制代码代码如下所示:
(上游)管道(下游)
readable.pipe(写);
分类流程
它不打算讨论经典流之前所谓的节点v0.4.then,流量分为几类(所有的抽象接口:
1.stream.readable可读流(的_read方法需要实现,并重点对数据流中读取的细节
2.stream.writable写入流(的_write方法需要实施,并注重细节的数据流写入
3.stream.duplex可读/写流(你需要实现上述两个接口,并在上述两个接口细节的关注
4.stream.transform继承双工(的_transform方法需要实现,并重点对数据块的处理
简单的说:
1)管道()的所有者必须具有可读流量(不受限)的能力。它has'readable ' /数据/'或'关闭' / 'error'series事件订阅,和阅读()/(),暂停/恢复()被调用。
2)管道()的参数必须具有可写流(不受限)的能力。它has'drain ' / 'pipe ' / 'unpipe '错误' / / 'finish'events访问和写()/(),最后打电话。
什么鬼
有焦虑的线索吗不要着急。我会打破流,并作为一个低级别的代码工人拉你。
流类,这是在js源代码定义的,是:
复制代码代码如下所示:
VaR是需要('eventsEventEmitter);
VaR工具=需要('util);
util.inherits(流,EE);
函数流(){
ee.call(本);
}
你可以看到,在本质上,流是EventEmitter,这意味着它有一个事件驱动的功能(发出 /,…)。我们都知道,Node.js是基于V8事件驱动的平台,实现事件驱动的异步回调的节点特征流编程。
例如,在可读流中,有可读事件。在暂停只读流中,只要数据块准备好读取,它将被发送到订阅服务器。可读的流是什么该请求的req.part、FTP或多在表达形式上传,系统中的标准输入,process.stdin,等与可读性的事件,我们可以做一个工具如处理shell命令的输出分析器:
复制代码代码如下所示:
process.stdin.on('readable,函数(){(){
VaR buf = process.stdin.read();
如果(BUF){
VaR数据= buf.tostring();
解析 /数据…
}
});
这就要求:
复制代码代码如下所示:
头10 some.txt节点parser.js |
对于可读流,我们也可以订阅它的数据和结束事件以获取数据块,并在流耗尽时获得通知,如在经典套接字示例中。
复制代码代码如下所示:
Req.on('connect功能(RES,插座,头){
Socket.on(数据功能(块){
console.log(chunk.tostring());
});
Socket.on(函数(){(){
Proxy.close();
});
});
可读流状态切换
需要注意的是,可读流有两种状态:流动模式(种子)和暂停模式(停顿)。前者不能停止的话,谁会被保存在管立即,后者将暂停直到下游stream.read是显式调用读取数据块的。可读流初始化暂停模式。
这两种状态可以互相切换,其中,
任何下列行为,停顿转流:
1。将数据事件订阅添加到可读的流中
2。可读调用。
三.将可读的流和桥接器的管道(可写)调用到可写流。
如果有以下行为,流动就会回到停顿状态:
1、可读流没有任何流的管道,可调。暂停()暂停
2。可读流管流,需要清除掉所有的数据事件订阅,并调用。Unpipe()由一个解除下游流动的方法之一。
神奇的
结合流的异步特性,我可以编写应用程序:直接将用户A的输出桥接到用户的B页面。
复制代码代码如下所示:
Router.post(后功能(REQ,RES){
VaR目标=请求标头{ 'destination}; / /人
{ } =请求目的地缓存;
是的,不返回,所以最好是Ajax请求。
});
当用户B请求时:
复制代码代码如下所示:
router.get( /收件箱功能(REQ,RES){
无功用户= { }标题用户的要求;
Cache.find(用户、功能(呃,previousreq){ / /找到之前的存款要求
新的多方形式;
form.parse(previousreq); / /文件给我。
形式。('part功能(部分){
part.pipe(RES); / /流法):
部分。(错误功能(ERR){
console.log(ERR);
Messaging.setRequestDone(UniqueID);
返回res.end(ERR);
});
});
});
});
参考资源
如何用流编写节点程序:流手册