是什么

async

async 函数会返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。

async function fn () {}
console.log(fn) // [AsyncFunction: fn]
console.log(fn()) // Promise {<fulfilled>: undefined}

可以看出,async函数执行完会自动返回一个状态为fulfilledPromise,也就是成功状态,但是值却是undefined,那要怎么才能使值不是undefined呢?很简单,函数有return返回值就行了

async function fn (num) {
  return num
}
console.log(fn) // [AsyncFunction: fn]
console.log(fn(10)) // Promise {<fulfilled>: 10}
fn(10).then(res => console.log(res)) // 10

可以看出,此时就有值了,并且还能使用then方法进行输出

await

await 是在等待一个 async 函数完成。不过按语法说明,await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值

返回值一定是 promise 对象

async function read(){
   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;
}

let promise = read()
promise.then((val) => {
	console.log(val);
})

错误捕获

无错误

const fs = require('fs');
const util = require('util');

const readFile = util.promisify(fs.readFile);

async function read(){
 	try {
    let value = await readFile('./first.txt','utf-8');
    console.log("await 拿到的value", value);
    return 'async read 返回值'; // 走 resolve
   } catch (err) {
      console.log('try-catch捕获的错误', err);
      return Promise.reject(err); // 走 reject
   }
   console.log('try-catch后边代码');
   // try、catch中如果都return,上面一行代码就不执行了
}

let promise = read()
promise.then(val => {
	console.log("then success:", val);
}, err => {
  console.log('then fail', err)
})

console.log(1111)