This commit is contained in:
Rico Sta. Cruz 2017-08-24 15:13:27 +08:00
parent f3fe0d09fb
commit d4b9c9977c
No known key found for this signature in database
GPG Key ID: CAAD38AE2962619A
2 changed files with 76 additions and 18 deletions

View File

@ -1,8 +1,22 @@
--- ---
title: Stream title: Node.js streams
category: Node.js category: Node.js
layout: 2017/sheet
--- ---
### Types
| Stream | Description |
| --- | --- |
| `Readable` | Data emitter |
| `Writable` | Data receiver |
| `Transform` | Emitter and receiver |
| `Duplex` | Emitter and receiver (independent) |
See: [Stream](https://nodejs.org/api/stream.html#stream_stream) _(nodejs.org)_
### Streams
```js ```js
const Readable = require('stream').Readable const Readable = require('stream').Readable
const Writable = require('stream').Writable const Writable = require('stream').Writable
@ -12,36 +26,71 @@ const Transform = require('stream').Transform
### Piping ### Piping
```js ```js
clock() // Readable stream clock() // Readable stream
.pipe(xformer()) // Transform stream .pipe(xformer()) // Transform stream
.pipe(renderer()) // Writable stream .pipe(renderer()) // Writable stream
``` ```
### Readable streams ### Methods
Readable streams are generators of data. Write data using `stream.push()`. ```js
stream.push(/*...*/) // Emit a chunk
stream.emit('error', error) // Raise an error
stream.push(null) // Close a stream
```
### Events
```js
const st = source()
st.on('data', (data) => { console.log('<-', data) })
st.on('error', (err) => { console.log('!', err.message) })
st.on('close', () => { console.log('** bye') })
st.on('finish', () => { console.log('** bye') })
```
Assuming `source()` is a readable stream.
### Flowing mode
```js
// Toggle flowing mode
st.resume()
st.pause()
```
```js
// Automatically turns on flowing mode
st.on('data', /*...*/)
```
Stream types
------------
{: .-three-column}
### Readable
```js ```js
function clock () { function clock () {
const stream = new Readable({ const stream = new Readable({
objectMode: true, objectMode: true,
read: () => {} // implement this if you need on-demand reading read() {}
}) })
setInterval(() => { setInterval(() => {
stream.push({ time: new Date() }) stream.push({ time: new Date() })
if (error) return stream.emit('error', error)
if (eof) return stream.push(null)
}, 1000) }, 1000)
return stream return stream
} }
// Implement read() if you
// need on-demand reading.
``` ```
### Transform streams Readable streams are generators of data. Write data using `stream.push()`.
Pass the updated chunk to `done(null, chunk)`. ### Transform
```js ```js
function xformer () { function xformer () {
@ -50,13 +99,15 @@ function xformer () {
return new Transform({ return new Transform({
objectMode: true, objectMode: true,
transform: (data, _, done) => { transform: (data, _, done) => {
done(null, { time: data.time, index: count++ }) done(null, { ...data, index: count++ })
} }
}) })
} }
``` ```
### Writable streams Pass the updated chunk to `done(null, chunk)`.
### Writable
```js ```js
function renderer () { function renderer () {
@ -70,14 +121,16 @@ function renderer () {
} }
``` ```
### Reading ### All together now
```js ```js
const st = source() clock() // Readable stream
st.on('data', (data) => { console.log('<-', data) }) .pipe(xformer()) // Transform stream
st.on('close', () => { console.log('** bye') }) .pipe(renderer()) // Writable stream
``` ```
## Also see ## Also see
{: .-one-column}
- <https://nodejs.org/api/stream.html>
- <https://github.com/substack/stream-handbook> - <https://github.com/substack/stream-handbook>

View File

@ -12,6 +12,11 @@ Example
### Basic example ### Basic example
```jsx
import React from 'react'
import ReactDOM from 'react-dom'
```
```jsx ```jsx
class Hello extends React.Component { class Hello extends React.Component {
render () { render () {