This page was saved using
WebZIP 7.0.3.1030
offline browser
on 12/02/19 14:55:01.
Address:
http://www.zhufengpeixun.cn/ahead/html/11.Stream-4.html
Title:
珠峰架构师成长计划 •
Size:
24745 •
Last Modified:
Sun, 01 Dec 2019 11:36:58 GMT
珠峰架构师成长计划
0.Async
0.editor
0.module
1.ES2015
2.Promise
3.Node
4.NodeInstall
5.REPL
6.NodeCore
7.module&NPM
8.Encoding
9.Buffer
10.fs
11.Stream-1
11.Stream-2
11.Stream-3
11.Stream-4
12-Network-2
12.NetWork-3
12.Network-1
13.tcp
14.http-1
14.http-2
15.compress
16.crypto
17.process
18.yargs
19.cache
20.action
21.https
22.cookie
23.session
24.express-1
24.express-2
24.express-3
24.express-4
25.koa-1
26.webpack-1-basic
26.webpack-2-optimize
26.webpack-3.tapable
26.webpack-4-AST
26.webpack-5-sources
26.webpack-6-loader
26.webpack-7-plugin
26.webpack-8-hand
28.redux
28.redux-jwt-back
28.redux-jwt-front
29.mongodb-1
29.mongodb-2
29.mongodb-3
29.mongodb-4
29.mongodb-5
29.mongodb-6
30.cms-1-mysql
30.cms-2-mysql
30.cms-3-mysql
30.cms-4-nunjucks
30.cms-5-mock
30.cms-6-egg
30.cms-7-api
30.cms-8-roadhog
30.cms-9-yaml
30.cms-10-umi
30.cms-12-dva
30.cms-13-dva-ant
30.cms-14-front
30.cms-15-deploy
31.dva
31.cms-13-dva-antdesign
33.redis
34.unittest
35.jwt
36.websocket-1
36.websocket-2
38.chat-api-1
38.chat-api-2
38.chat-3
38.chat-api-3
38.chat
38.chat2
38.chat2
39.crawl-0
39.crawl-1
39.crawl-2
40.deploy
41.safe
42.test
43.nginx
44.enzyme
45.docker
46.elastic
47.oauth
48.wxpay
index
51.typescript
52.UML
53.design
index
54.linux
57.ts
56.react-ssr
58.ts_react
59.ketang
59.ketang2
61.1.devops-linux
61.2.devops-vi
61.3.devops-user
61.4.devops-auth
61.5.devops-shell
61.6.devops-install
61.7.devops-system
61.8.devops-service
61.9.devops-network
61.10.devops-nginx
61.11.devops-docker
61.12.devops-jekins
61.13.devops-groovy
61.14.devops-php
61.15.devops-java
61.16.devops-node
61.17.devops-k8s
62.1.react-basic
62.2.react-state
62.3.react-high
62.4.react-optimize
62.5.react-hooks
62.6.react-immutable
62.7.react-mobx
62.8.react-source
63.1.redux
63.2.redux-middleware
63.3.redux-hooks
63.4.redux-saga
63.5.redux-saga-hand
64.1.router
64.2.router-connected
65.1.typescript
65.2.typescript
65.3.typescript
65.4.antd
66-1.vue-base
66-2.vue-component
66-3.vue-cli3.0
66-4.$message组件
66-5.Form组件
66-6.tree
66-7.vue-router-apply
66-8.axios-apply
66-9.vuex-apply
66-10.jwt-vue
66-11.vue-ssr
66-12.nuxt-apply
66-13.pwa
66-14.vue单元测试
66-15.权限校验
67-1-network
68-2-wireshark
7.npm2
69-hooks
70-deploy
71-hmr
72.deploy
73.import
74.mobile
75.webpack-1.文件分析
75.webpack-2.loader
75.webpack-3.源码流程
75.webpack-4.tapable
75.webpack-5.源码准备
75.webpack-6.实现
76.react_optimize
77.ts_ketang_back
77.ts_ketang_front
78.vue-domdiff
79.grammar
80.tree
81.axios
65.4.definition
82.1.react
83.upload
82.2.react
82.3.react-router
82.4.redux
84.graphql
82.5.redux_middleware
82.5.connected
82.6.saga
82.7.dva
85.antpro
82.8.roadhog
82.9.umi
82.10.antdesign
1. 通过流读取数据
2. read(fs:2060,372)
3. push(fs:2108,197)
4. end事件
5. doRead
6. howMuchToRead
1. 通过流读取数据
#
用Readable创建对象readable后,便得到了一个可读流。
如果实现_read方法,就将流连接到一个底层数据源。
流通过调用_read向底层请求数据,底层再调用流的push方法将需要的数据传递过来。
当readable连接了数据源后,下游便可以调用readable.read(n)向流请求数据,同时监听readable的data事件来接收取到的数据。
2. read(fs:2060,372)
#
read方法中的逻辑可用下图表示
3. push(fs:2108,197)
#
消耗方调用read(n)促使流输出数据,而流通过_read()使底层调用push方法将数据传给流。
如果流在流动模式下(state.flowing为true)输出数据,数据会自发地通过data事件输出,不需要消耗方反复调用read(n)。(fs:268)
如果调用push方法时缓存为空,则当前数据即为下一个需要的数据。这个数据可能先添加到缓存中,也可能直接输出。
执行read方法时,在调用_read后,如果从缓存中取到了数据,就以data事件输出(fs:482)。
所以,如果_read异步调用push时发现缓存为空,则意味着当前数据是下一个需要的数据,且不会被read方法输出,应当在push方法中立即以data事件输出(_stream_readable:268)。
4. end事件
#
在调用完_read()后,read(n)会试着从缓存中取数据(_stream_readable:459)。
如果_read()是异步调用push方法的,则此时缓存中的数据量不会增多,容易出现数据量不够的现象(_stream_readable:463)。
如果read(n)的返回值为null,说明这次未能从缓存中取出所需量的数据。 此时,消耗方需要等待新的数据到达后再次尝试调用read方法(_stream_readable:280)。
在数据到达后,流是通过readable事件来通知消耗方的(_stream_readable:280)。
在此种情况下,push方法如果立即输出数据,接收方直接监听data事件即可,否则数据被添加到缓存中,需要触发readable事件(_stream_readable:280)
消耗方必须监听这个readable事件,再调用read方法取得数据。
5. doRead
#
流中维护了一个缓存,当缓存中的数据足够多时,调用read()不会引起_read()的调用,即不需要向底层请求数据。
用doRead来表示read(n)是否需要向底层取数据(_stream_readable:431)
state.reading标志上次从底层取数据的操作是否已完成。一旦push方法被调用,就会设置为false,表示此次_read()结束。
state.highWaterMark是给缓存大小设置的一个上限阈值。
如果取走n个数据后,缓存中保有的数据不足这个量,便会从底层取一次数据(_stream_readable:431)。
6. howMuchToRead
#
用read(n)去取n个数据时,m = howMuchToRead(n)是将从缓存中实际获取的数据量(_stream_readable:346)。
可读流是获取底层数据的工具,消耗方通过调用read方法向流请求数据,流再从缓存中将数据返回,或以data事件输出。
如果缓存中数据不够,便会调用_read方法去底层取数据。
该方法在拿到底层数据后,调用push方法将数据交由流处理(立即输出或存入缓存)。
可以结合readable事件和read方法来将数据全部消耗,这是暂停模式的消耗方法。
read(0) 只是填充缓存区,并不真正读取
read() 如果处于流动模式,并且缓存区大小不为空,则返回缓存区第一个buffer的长度,否则读取整个缓存 如果读到了数据没有返回值,但是会发射data事件,数据也能取到,也就是用来清空缓存区
Powered by
idoc
. Dependence
Node.js
run.