Skip to content

Commit 6190736

Browse files
committed
update
1 parent f8d5619 commit 6190736

File tree

6 files changed

+222
-6
lines changed

6 files changed

+222
-6
lines changed

README.md

+5-6
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
- [jQuery deferred](./part2-jquery/02-jquery-deferred.md)
2323
- [jQuery promise](./part2-jquery/03-jquery-promise.md)
2424

25-
**part3 Promise**
25+
**part3 ES6-Promise**
2626

2727
- [Promise 加入 ES6 标准](./part3-promise/01-promise-in-es6.md)
2828
- [Promise 在 ES6 中的具体应用](./part3-promise/02-promise-use.md)
@@ -42,13 +42,12 @@
4242

4343
**part5 async-await**
4444

45-
- ES7 中引入 async-await
46-
- 如何在 nodejs`v6.x`版本中使用 async-await
45+
- [ES7 中引入 async-await](./part5-async-await/01-async-await-in-es7.md)
46+
- [如何在 nodejs `v6.x`版本中使用 async-await](./part5-async-await/02-use-in-node-v6.md)
4747

48-
**最后**
49-
50-
- 总结
48+
**part6 总结**
5149

50+
- [总结](./part6-end/01-summary.md)
5251

5352
## 运行程序的说明
5453

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# ES7 中引入 async-await
2+
3+
前面介绍完了`Generator`的异步处理,可以说是跌跌撞撞,经过各种基础介绍和封装,好容易出了一个比较简洁的异步处理方案,学习成本非常高————这显然不是我们想要的!
4+
5+
因此,还未发布的 ES7 就干脆自己参照`Generator`封装了一套异步处理方案————`async-await`。说是参照,其实可以理解为是`Generator`的语法糖!
6+
7+
本节示例代码参照[这里](./test.js)
8+
9+
## 本节内容概述
10+
11+
- `Generator``async-await`的对比
12+
- 使用`async-await`的不同和好处
13+
- 接下来...
14+
15+
## `Generator``async-await`的对比
16+
17+
先来一段`Generator`处理异步的代码,前面已经介绍过了,看不明白的再获取接着看。
18+
19+
```javascript
20+
co(function* () {
21+
const r1 = yield readFilePromise('some1.json')
22+
console.log(r1) // 打印第 1 个文件内容
23+
const r2 = yield readFilePromise('some2.json')
24+
console.log(r2) // 打印第 2 个文件内容
25+
})
26+
```
27+
28+
再来一段`async-await`的执行代码如下,两者做一个比较。
29+
30+
```javascript
31+
const readFilePromise = Q.denodeify(fs.readFile)
32+
33+
// 定义 async 函数
34+
const readFileAsync = async function () {
35+
const f1 = await readFilePromise('data1.json')
36+
const f2 = await readFilePromise('data2.json')
37+
console.log('data1.json', f1.toString())
38+
console.log('data2.json', f2.toString())
39+
40+
return 'done' // 先忽略,后面会讲到
41+
}
42+
// 执行
43+
const result = readFileAsync()
44+
```
45+
46+
从上面两端代码比较看来,`async function`代替了`function* ``await`代替了`yield`,其他的再没有什么区别了。哦,还有,使用`async-await`时候不用再引用`co`这种第三方库了,直接执行即可。
47+
48+
## 使用`async-await`的不同和好处
49+
50+
第一,`await`后面不能再跟`thunk`函数,而必须跟一个`Promise`对象(因此,`Promise`才是异步的终极解决方案和未来)。跟其他类型的数据也OK,但是会直接同步执行,而不是异步。
51+
52+
第二,执行`const result = readFileAsync()`返回的是个`Promise`对象,而且上面代码中的`return 'done'`会直接被下面的`then`函数接收到
53+
54+
```javascript
55+
result.then(data => {
56+
console.log(data) // done
57+
})
58+
```
59+
60+
第三,从代码的易读性来将,`async-await`更加易读简介,也更加符合代码的语意。而且还不用引用第三方库,也无需学习`Generator`那一堆东西,使用成本非常低。
61+
62+
**因此,如果 ES7 正式发布了之后,强烈推荐使用`async-await`。但是现在尚未正式发布,从稳定性考虑,还是`Generator`更好一些。**
63+
64+
## 接下来...
65+
66+
node `v7` 版本已经开始原生支持`async-await`了,不过 node 的目前稳定版本还是`v6`,尚不支持,怎么办?———— 当然是万能的`babel`!下一节就介绍。
67+
68+
## 求打赏
69+
70+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
71+
72+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 如何在 nodejs `v6.x`版本中使用 async-await
2+
3+
本节介绍一下如何使用`babel`来让 node `v6` 版本也能运行`async-await`
4+
5+
## 本节内容概述
6+
7+
- 安装必要的插件
8+
- 创建入口文件并执行
9+
10+
## 安装必要的插件
11+
12+
运行`npm i babel-core babel-plugin-transform-runtime babel-preset-es2015 babel-preset-stage-3 babel-runtime --save`安装一堆需要的插件。
13+
14+
然后在项目根目录创建`.babelrc`文件,文件内容编写为
15+
16+
```json
17+
{
18+
"presets": ["stage-3", "es2015"],
19+
"plugins": ["transform-runtime"]
20+
}
21+
```
22+
23+
## 创建入口文件并执行
24+
25+
加入你编写`async-await`的代码文件是`test.js`,那么你需要创建另一个文件,例如`test-entry.js`作为入口文件。入口文件内容编写为
26+
27+
```javascript
28+
require("babel-core/register");
29+
require("./test.js");
30+
```
31+
32+
然后直接运行`node test-entry.js`就可以了
33+
34+
## 求打赏
35+
36+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
37+
38+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)

part5-async-await/test-entry.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
require("babel-core/register");
2+
require("./test.js");

part5-async-await/test.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
const fs = require('fs')
2+
const path = require('path')
3+
const Q = require('q')
4+
5+
function fn1() {
6+
7+
const fileName1 = path.resolve(__dirname, '../data/data1.json')
8+
const fileName2 = path.resolve(__dirname, '../data/data2.json')
9+
const readFilePromise = Q.denodeify(fs.readFile)
10+
11+
// 定义 async 函数
12+
const readFileAsync = async function () {
13+
const f1 = await readFilePromise(fileName1)
14+
const f2 = await readFilePromise(fileName2)
15+
console.log('data1.json', f1.toString())
16+
console.log('data2.json', f2.toString())
17+
18+
return 'done'
19+
}
20+
// 执行
21+
const result = readFileAsync()
22+
23+
result.then(data => {
24+
console.log(data)
25+
})
26+
}
27+
fn1()

part6-end/01-summary.md

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# 总结
2+
3+
一周左右的业余时间总结完,写完,也是累得我够呛。不算什么体力活,但是天天的坐在书桌旁写这些东西也是很考验一个人的定力,没点耐性是肯定不行的 ———— 这算是获奖感言吗 😂
4+
5+
## 本节内容概述
6+
7+
- 基础知识不可忽略
8+
- 异步操作代码的变化
9+
- 写在最后
10+
11+
## 础知识不可忽略
12+
13+
这里的基础知识分为两部分,都不能忽略,都需要深入研究和思考
14+
15+
- 什么是异步,异步的实现原理,event-loop,以及和事件绑定的关系。这些在最初介绍时,都讲过,不要看完了就忘记了;
16+
- 无论异步操作的写法如何变化,JS 还是单线程、异步执行的语言,`callback`一直都存在而且发挥作用,这个在此前的章节一直强调;
17+
18+
## 异步操作代码的变化
19+
20+
最后我们来感受一下,从一开始`callback`方式到后来的`async-await`方式,前前后后编写异步代码的变化。从变化中就可以体会到,确实越来越简洁,越来越易读。
21+
22+
**`callback`方式**
23+
24+
```javascript
25+
fs.readFile('some1.json', (err, data) => {
26+
fs.readFile('some2.json', (err, data) => {
27+
fs.readFile('some3.json', (err, data) => {
28+
fs.readFile('some4.json', (err, data) => {
29+
30+
})
31+
})
32+
})
33+
})
34+
```
35+
36+
**`Promise`方式**
37+
38+
```javascript
39+
readFilePromise('some1.json').then(data => {
40+
return readFilePromise('some2.json')
41+
}).then(data => {
42+
return readFilePromise('some3.json')
43+
}).then(data => {
44+
return readFilePromise('some4.json')
45+
})
46+
```
47+
48+
**`Generator`方式**
49+
50+
```javascript
51+
co(function* () {
52+
const r1 = yield readFilePromise('some1.json')
53+
const r2 = yield readFilePromise('some2.json')
54+
const r3 = yield readFilePromise('some3.json')
55+
const r4 = yield readFilePromise('some4.json')
56+
})
57+
```
58+
59+
**`async-await`方式**
60+
61+
```javascript
62+
const readFileAsync = async function () {
63+
const f1 = await readFilePromise('data1.json')
64+
const f2 = await readFilePromise('data2.json')
65+
const f3 = await readFilePromise('data3.json')
66+
const f4 = await readFilePromise('data4.json')
67+
}
68+
```
69+
70+
## 写在最后
71+
72+
写到这里,也没啥可写的了,这里希望大家多多按照自己的思路来思考问题吧。最后,欢迎扫码转账给我打赏,哈哈!
73+
74+
## 求打赏
75+
76+
如果你看完了,感觉还不错,欢迎给我打赏 ———— 以激励我更多输出优质内容
77+
78+
![](http://images2015.cnblogs.com/blog/138012/201702/138012-20170228112237798-1507196643.png)

0 commit comments

Comments
 (0)