为什么会出现async函数

首先从大的方面来说,出现async函数时为了解决JS编程中的异步操作,再往具体说就是为了对以往异步编程方法的一种改进,也有人说仅仅只是Generator 函数的语法糖,这个我暂时还没理解到那个程度,因为我对Generator还是一知半解,等理解透一些了会专门写篇文章记录一下的。回到async函数,它算是阶段性的解决了异步编程的问题,也就是说让我们无限接近了异步编程的最高境界,就是不用关心它是不是异步,一切都是同步编程的写法,那样可读性就很强了。

什么是async函数

async函数是ES2017标准新引入的,使得异步操作变得更加方便。例如在nodejs中使用async函数读取两个文件,可以这样

const fs = require('fs');
const asyncReadFile = async function () {
  const f1 = await readFile('/etc/fstab');
  const f2 = await readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

async函数实际上就是对Generator函数的改进,体现在以下四点。

  • 内置执行器
  • 也就是说async函数可以像普通函数那样一行直接执行
  • 更好的语义
  • 这个基本上来说就是async里面包的是异步操作,而await得到的就是异步操作的结果
  • 返回值是 Promise
  • async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。

简单用法和使用感受

  • 简单用法
  • async函数里面包含的一个异步操作,而异步操作结果则由await接收,这个返回值是一个promise对象,所以就有可能成功或者失败,所以最好是做一些错误处理,一般使用try..catch
async function myFunction() {
try {
  await somethingThatReturnsAPromise();
} catch (err) {
  console.log(err);
}
}
  • 还有一点,await 命令只能用在 async 函数之中,如果用在普通函数,就会报错。
  • 如果确实希望多个请求并发执行,可以使用 Promise.all 方法。,这个暂时还没试过

参考文章:http://es6.ruanyifeng.com/#docs/async