js中async/await

虽然promise解决了callback的回调地狱

但是promise中也会出现多个then,catch的嵌套,可读性有时候也很差.

async和await就是来优化promise的。

并不是说谁可以替代谁,看需求!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// callback
// promise 是基于 callback的
// async await是基于promise的

function getJson() {
return new Promise((resolve, reject) => {
// 模拟异步
setTimeout(() => {
resolve("ok");
}, 2000);
})
}

function makeRequest() {
return getJson().then(data => {
console.log(data);
return "done";
})
}

// promise调用
// makeRequest().then(data => {
// console.log(data + "sd");
// }).catch(e => {
// console.log(e, "sb");
// });

/* 总结:
1. 能够用then或者catch的函数,必须返回值是promise。
2. then和catch返回值默认也是promise(即使你不主动return promise)
3. 在then里面如果有return "hello"; 等价于 Promise.resolve('hello');

4. promise的resolve或者reject的值,只能被最先的then或者catch获取。只能获取一次。
5. 推荐用catch,而不用用reject去捕获错误。catch更好,因为可以兜底(嘿嘿,意会)。
*/

// 当出现then嵌套时,请考虑用async, await来优化。
// node8 对 async和await 已经LTS, 长期支持了。

// async 修饰function关键字(当然了,也可以修饰箭头函数 async () => {})
// await 修饰被调用的函数。
// async 默认返回一个promise。类似then或者catch
const start = async () => {
try {
// 这里就直接获取的是resolve的值。
let v = await getJson();
console.log("getJson", v);
// 等价 Promise.resolve("456");
return "456";
} catch (e) {
// 这里捕获的是rejet的值,因为await保证了同步,所以可以通过try catch。
// **当然了也可以在外部async那个方法后catch。
console.log("error", e);
}
};

start().then(data => {
console.log("async默认返回", data);
}).catch(e => {
console.log("兜底", e);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs');

const readFile = function (fileName) {
return new Promise(function (resolve, reject) {
fs.readFile(fileName, function(error, data) {
if (error) reject(error);
resolve(data);
});
});
};

const asyncReadFile = async function () {
try {
const f1 = await readFile('/etc/fstab'); // 这里的f1就是promise中的resolve的值
const f2 = await readFile('/etc/shells');// 这里的f2就是promise中的resolve的值
} catch(e) {
console.log('这是reject的值');
}
};

f1 f2 就是resolve的返回啊,
如果要出理reject的返回,请用try catch

加油!相信你的付出。