含义

定义:是Generator函数的语法糖。

如下例子:

  1. const asyncReadFile = function* (){
  2. const f1 = yield readFile('/etc/fstab');
  3. const f2 = yield readFile('/etc/shells');
  4. console.log(f1.toString());
  5. console.log(f2.toString());
  6. }

上面是Generator函数,用async改写成如下:

  1. const asyncReadFile = async function(){
  2. const f1 = await readFile('/etc/fstab');
  3. const f2 = await readFile('/etc/shells');
  4. console.log(f1.toString());
  5. console.log(f2.toString());
  6. }

没错,只是把 * 换成 asyncyield 换成 await

但作用体如下:

  • async不需要next()

Generator函数的执行必须要next()方法,才会继续往下执行。但async就不需要,会自动的去执行,效果和Generator函数一样。

  • 语义更清楚

async本身意思就是异步操作,而await表示紧跟后面等待结果。

  • 适用性更广泛

yield命令后面只能是Promisse对象或者Thunk函数,而async函数的await命令后面,可以是除了是Promise对象还可以是原始类型的值(数值、字符串和布尔值,但会立马自动转成 resolved 的 Promise对象)

  • 返回值不同

async返回值是Promise对象,而Generator函数的返回值是Iterator对象。

async也可以看做是多个异步操作的集合,包装成一个Promise对象,而await命令是内部then命令的语法糖。

用法

async函数返回一个Promise对象,可使用then方法添加回调函数。当函数执行的过程中,一旦遇到了await就会先返回,等到异步操作完成后,再接着执行函数体后面的语句。

例如:

  1. async function getStockPriceByName(name){
  2. const symbol = await getStockSymbol(name);
  3. const stockPrice = await getStockPrice(symbol);
  4. return stockPrice;
  5. }
  6. getStockPriceByName("goog").then((result)=>{
  7. console.log(result);
  8. })

async有很多种使用形式,例如: