Skip to content

Commit abc86fd

Browse files
committed
update
1 parent 32016cf commit abc86fd

9 files changed

+190
-7
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@
3232

3333
**part4 Generator**
3434

35-
- Generator 横空出世
36-
- Iterator 遍历器
37-
- 带着 Iterator 来看 Generator
38-
- Generator 与异步结合
39-
- 使用大名鼎鼎的 co 库
40-
- koa 中使用 Generator
41-
- Generator 的本质是什么?是否取代了 callback
35+
- [ES6 惊现 Generator](./part4-generator/01-generator-in-es6.md)
36+
- [Iterator 遍历器](./part4-generator/02-iterator.md)
37+
- [带着 Iterator 来看 Generator](./part4-generator/03-iterator-for-generator.md)
38+
- [Generator 与异步结合](./part4-generator/04-generator-for-async.md)
39+
- [使用大名鼎鼎的 co 库](./part4-generator/05-co.md)
40+
- [koa 中使用 Generator](./part4-generator/06-generator-for-koa.md)
41+
- [Generator 的本质是什么?是否取代了 callback](./part4-generator/07-generator-callback.md)
4242

4343
**part5 async-await**
4444

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# ES6 惊现 Generator
2+
3+
在 ES6 出现之前,基本都是各式各样类似`Promise`的解决方案来处理异步操作的代码逻辑,但是 ES6 的`Generator`却给异步操作又提供了新的思路,马上就有人给出了如何用`Generator`来更加优雅的处理异步操作。
4+
5+
## 本节内容概述
6+
7+
- `Generator`简介
8+
- `Generator`最终如何处理异步操作
9+
- 接下来...
10+
11+
## `Generator`简介
12+
13+
先来一段最基础的`Generator`代码
14+
15+
```javascript
16+
function* Hello() {
17+
yield 100
18+
yield (function () {return 200})()
19+
return 300
20+
}
21+
22+
var h = Hello()
23+
console.log(typeof h) // object
24+
25+
console.log(h.next()) // { value: 100, done: false }
26+
console.log(h.next()) // { value: 200, done: false }
27+
console.log(h.next()) // { value: 300, done: true }
28+
console.log(h.next()) // { value: undefined, done: true }
29+
```
30+
31+
在 nodejs 环境执行这段代码,打印出来的数据都在代码注释中了,也可以自己去试试。将这段代码简单分析一下吧
32+
33+
- 定义`Generator`时,需要使用`function*`,其他的和定义函数一样。内部使用`yield`,至于`yield`的用处以后再说
34+
- 执行`var h = Hello()`生成一个`Generator`对象,经验验证`typeof h`发现不是普通的函数
35+
- 执行`Hello()`之后,`Hello`内部的代码不会立即执行,而是出于一个**暂停**状态
36+
- 执行第一个`h.next()`时,会激活刚才的暂停状态,开始执行`Hello`内部的语句,但是,直到遇到`yield`语句。一旦遇到`yield`语句时,它就会将`yield`后面的表达式执行,并返回执行的结果,然后又立即进入**暂停**状态。
37+
- 因此第一个`console.log(h.next())`打印出来的是`{ value: 100, done: false }``value`是第一个`yield`返回的值,`done: false`表示目前处于暂停状态,尚未执行结束,还可以再继续往下执行。
38+
- 执行第二个`h.next()`和第一个一样,不在赘述。此时会执行完第二个`yield`后面的表达式并返回结果,然后再次进入**暂停**状态
39+
- 执行第三个`h.next()`时,程序会打破暂停状态,继续往下执行,但是遇到的不是`yield`而是`return`。这就预示着,即将执行结束了。因此最后返回的是`{ value: 300, done: true }``done: true`表示执行结束,无法再继续往下执行了。
40+
- 再去执行第四次`h.next()`时,就只能得到`{ value: undefined, done: true }`,因为已经结束,没有返回值了。
41+
42+
一口气分析下来,发现并不是那么简单,虽然这只是一个最最简单的`Generator`入门代码 ———— 可见`Generator`的学习成本多高 ———— 但是一旦学会,那将受用无穷!别着急,跟着我的节奏慢慢来,一行一行代码看,你会很快深入了解`Genarator`
43+
44+
但是,你要详细看一下上面的所有步骤,争取把我写的每一步都搞明白。如果搞不明白细节,至少要明白以下几个要点:
45+
46+
- `Generator`不是函数,不是函数,不是函数
47+
- `Hello()`不会立即出发执行,而是一上来就暂停
48+
- 每次`h.next()`都会打破暂停状态去执行,直到遇到下一个`yield`或者`return`
49+
- 遇到`yield`时,会执行`yeild`后面的表达式,并返回执行之后的值,然后再次进入暂停状态,此时`done: false`
50+
- 遇到`return`时,会返回值,执行结束,即`done: true`
51+
- 每次`h.next()`的返回值永远都是`{value: ... , done: ...}`的形式
52+
53+
54+
## `Generator`最终如何处理异步操作
55+
56+
上面只是一个最基本最简单的介绍,但是我们看不到任何与异步操作相关的事情,那我们接下来就先展示一下最终我们将使用`Generator`如何做异步操作。
57+
58+
之前讲解`Promise`时候,依次读取多个文件,我们是这么操作的(看不明白的需要回炉重造哈),主要是使用`then`做链式操作。
59+
60+
```javascript
61+
readFilePromise('some1.json').then(data => {
62+
console.log(data) // 打印第 1 个文件内容
63+
return readFilePromise('some2.json')
64+
}).then(data => {
65+
console.log(data) // 打印第 2 个文件内容
66+
return readFilePromise('some3.json')
67+
}).then(data => {
68+
console.log(data) // 打印第 3 个文件内容
69+
return readFilePromise('some4.json')
70+
}).then(data=> {
71+
console.log(data) // 打印第 4 个文件内容
72+
})
73+
```
74+
75+
而如果学会`Generator`那么读取多个文件就是如下这样写。先不要管如何实现的,光看一看代码,你就能比较出哪个更加简洁、更加易读、更加所谓的优雅!
76+
77+
```javascript
78+
co(function* () {
79+
const r1 = yield readFilePromise('some1.json')
80+
console.log(r1) // 打印第 1 个文件内容
81+
const r2 = yield readFilePromise('some2.json')
82+
console.log(r2) // 打印第 2 个文件内容
83+
const r3 = yield readFilePromise('some3.json')
84+
console.log(r3) // 打印第 3 个文件内容
85+
const r4 = yield readFilePromise('some4.json')
86+
console.log(r4) // 打印第 4 个文件内容
87+
})
88+
```
89+
90+
不过,要学到这一步,还需要很长的路要走。不过不要惊慌,也不要请如来佛祖,跟着我的节奏来,认真看,一天包教包会是没问题的!
91+
92+
## 接下来...
93+
94+
接下来我们不会立刻讲解如何使用`Generator`做异步操作,而是看一看`Generator`是一个什么东西!说来话长,这要从 ES6 的另一个概念`Iterator`说起。
95+
96+
## 求打赏
97+
98+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
99+
100+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)

part4-generator/02-iterator.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Iterator 遍历器
2+
3+
4+
5+
## 本节内容概述
6+
7+
8+
9+
## 求打赏
10+
11+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
12+
13+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
3+
4+
5+
6+
7+
## 求打赏
8+
9+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
10+
11+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
3+
4+
5+
6+
7+
## 求打赏
8+
9+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
10+
11+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)

part4-generator/05-co.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
3+
4+
5+
6+
7+
## 求打赏
8+
9+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
10+
11+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
3+
4+
5+
6+
7+
## 求打赏
8+
9+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
10+
11+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
3+
4+
generator 本质上就是一个能让程序暂停执行的状态
5+
6+
7+
## 求打赏
8+
9+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
10+
11+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)

part4-generator/test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
function fn1() {
3+
function* Hello() {
4+
yield 100
5+
yield (function () {return 200})()
6+
return 300
7+
}
8+
var h = Hello()
9+
console.log(typeof h) // object
10+
console.log(h.next()) // { value: 100, done: false }
11+
console.log(h.next()) // { value: 200, done: false }
12+
console.log(h.next()) // { value: 300, done: true }
13+
console.log(h.next()) // { value: undefined, done: true }
14+
}
15+
fn1()

0 commit comments

Comments
 (0)