async 函数

含义

ES2017 标准引入 async 函数,使得异步操作更加的简单,实际上就是 Generator 函数的语法糖

const asyncReadFile = async function(){
  const result1 = await fs.readFile('file1');
  const result2 = await fs.readFile('file2');
}

上面就是 async 函数,和 Generator 函数相比就是把*换成了async,把yield换成了await,直接执行asyncReadFile函数,会达到和 Generator 函数一样的效果。

对比 Generator

  1. 内置的执行器,Generator 函数需要自己写执行器,而async函数不需要
  2. 更好的语义,async表示函数里面有异步操作,await表示后面的表达式是异步操作
  3. 更广的适用性,yield后面只能跟Thunk函数或者 Promise 对象,而await后面可以跟任何对象和值,当后面的值为数值,字符串和布尔值时,操作等同于同步操作
  4. 返回值是 Promise 对象,可以用then指定下一步操作

基本用法

  • async 函数的错误可以在返回的 Promise 对象通过catch捕捉
  • async 函数内部return的值,可以在返回的 Promise 对象回调函数里面接收
  • async 函数返回的 Promise 对象,需要等到函数内部所有异步操作完成后,状态才会改变

语法

  • 只要有一个await后面 Promise 对象的状态变为rejected状态,async 会终止执行,可以在await后面的Promise 对象直接捕获错误,可以避免终止整个 async 函数的执行

使用注意点

  1. 建议把await命令放在try...catch块中
  2. 多个await命令后面的异步操作如果没有继发关系,最好让他们同时触发,缩短程序的执行时间,使用Promise.all()可以实现
  3. await命令只能用在 async 函数里面,用在普通函数会报错,常见的forEach()函数里面不能使用await关键字,可以使用for...of代替
上次更新: 8/20/2018, 10:52:36 PM