一、async与await
-
概念
async:本质上就是generator生成器函数
await:就相当于是yield产出
-
优势
- 内置的执行器是co —— 简化了异步的执行
- 语义化更强
- 更广的使用性 —— 后面可以不止是promise对象
- 返回值一定是promise对象(内部自动触发resolve和reject)
-
基本使用
const fs = require('fs'); const util = require('util'); let readFile = util.promisify(fs.readFile) async function read() { try { // 生成函数与普通函数不同的是,可以通过try/catch捕获异步异常 let value1 = await readFile('./name.txt', 'utf-8'); // 直接拿到异步结果 let value2 = await readFile(value1, 'utf-8'); let value3 = await readFile(value2, 'utf-8'); console.log('hello world'); return value3 // 不管返回什么,最终都会变成promise对象,并自动帮你调用resolve或reject } catch (error) { console.log('91: ' + error) } } let promise = read(); // 返回promise对象 promise.then((val) => { console.log(val); }); // 正常输出: // hello world // 90 // 异常输出:./name.text => ./nam.txt // 91: Error: ENOENT: no such file or directory, open 'C:\Users\21757\Desktop\ES6\nam.txt' // undefined
-
实现all得错误忽略
用all方法来执行异步操作,就会直接抛出错误没法执行后面的,那么我们可以通过async和await/try-catch/set来配合实现这个功能,平常不会这么做
let fs = require('fs'); let util = require('util') let readFile = util.promisify(fs.readFile) async function read(){ let value1, value2, value3; let res = new Set(); try{ value1 = await readFile('name.txt','utf-8'); }catch(err){ // 注意:这里catch不能去掉,去掉会导致无法捕获异常 } try{ value2 = await readFile('number.tx','utf-8'); }catch(err){ } try{ value3 = await readFile('score.txt','utf-8'); }catch(err){ } res.add(value1) res.add(value2) res.add(value3) return res; } read().then((val)=>{ console.log(val); }) // Set(3) { './number.txt', undefined, '90' } 然后再把undefined去掉就可以了