async / await

发布于 2022-12-25  37 次阅读


  • 内置执行期 co 函数封装到了 await 内部
  • 更好的语义,更广的适应性

是什么

  • async 用于声明一个 function 是异步的。
    • 默认返回一个 fulfilled 状态的 value 为 undefined 的 Promise
  • await 用于等待一个异步方法执行完成。
  • 作用
    • 他的作用是用同步的方式,执行异步操作

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 函数return的值会被隐式转换为promise对象,使用 Promise.resolve(xxx) 或 reject()
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)
Untitled

有错误

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

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

async function read(){
 	try {
    let value = await readFile('./first.tt','utf-8');
    console.log("await 拿到的value", value);
    return 'async read 返回值';
   } catch (err) {
      console.log('try-catch捕获的错误', err);
      return Promise.reject(err); // 走 reject
   }
}

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

console.log(1111)

try 或者 catch 不显式的 return 值,默认走 resolve

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

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

async function read(){
 	 try {
    let value = await readFile('./first.tt','utf-8');
    console.log("await 拿到的value", value);
   } catch (err) {
    console.log('try-catch捕获的错误', err);
   }
   console.log('try-catch后边代码'); // 这里会执行
}

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

console.log(1111)
最后更新于 2023-07-20