ES7:async/await
关键字
-
async 和 await 是 ES2017 中提出来的。
-
异步操作是 JavaScript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。从最早的回调函数,到 Promise 对象,每次都有所改进,但又让人觉得不彻底。它们都有额外的复杂性,都需要理解抽象的底层运行机制。
-
不就是读取一个文件吗,干嘛要搞得这么复杂?async 函数就是隧道尽头的亮光,很多人认为它是异步操作的终极解决方案;
-
ES2017提供了async和await关键字:
- async 用于修饰一个 function,表示该函数里面有异步操作(Promise的调用)
- await 需要定义在async修饰函数的内部,await后面跟的一般都是一个函数(函数里面包含有Promise)的调用 【await后面:promise实例化对象】
- 如果有哪一个await操作出错了,会中断async函数的执行
使用
const fs = require('fs');
// 将异步读取文件的代码封装
function myReadFile (path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (err, data) => {
err ? reject(err) : resolve(data.length);
});
});
}
// 1.async后的函数表示里面有异步操作
async function abc () {
// 2.等待这个异步操作返回结果!我们现在写的异步,但是完全是同步的方式写异步!!
let a = await myReadFile('./a.txt');
let b = await myReadFile('./b.txt');
let c = await myReadFile('./c.txt');
console.log(b);
console.log(a);
console.log(c);
}
abc();
await 只会等待 promise 成功的结果, 如果失败了会报错, 需要 try catch
async function abc () {
try {
let a = await myReadFile('./a.txt');
let b = await myReadFile('./b.txt');
let c = await myReadFile('./c.txt');
console.log(b);
console.log(a);
console.log(c);
}
catch (err) {
console.log('读取文件失败了', err)
}
}
abc();