ES6 学习笔记(14) async 函数

2018-03-16  本文已影响0人  MrZhou_b216

1. 含义


async函数是什么?一句话,它就是 Generator 函数的语法糖。
async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已。
async函数对 Generator 函数的改进,体现在以下四点

2. 基本用法


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

  async function getStockPriceByName(name) {
    const symbol = await getStockSymbol(name);
    const stockPrice = await getStockPrice(symbol);
    return stockPrice;
  }

  getStockPriceByName('goog').then(function (result) {
    console.log(result);
  });

3. 语法


async函数的语法规则总体上比较简单,难点是错误处理机制。

4. async 函数的实现原理


async函数的实现原理,就是将 Generator 函数和自动执行器,包装在一个函数里。

5.异步遍历器

Iterator 接口是一种数据遍历的协议,只要调用遍历器对象的next方法,就会得到一个对象,表示当前遍历指针所在的那个位置的信息。next方法返回的对象的结构是{value, done},其中value表示当前的数据的值,done是一个布尔值,表示遍历是否结束。

这里隐含着一个规定,next方法必须是同步的,只要调用就必须立刻返回值。也就是说,一旦执行next方法,就必须同步地得到valuedone这两个属性。如果遍历指针正好指向同步操作,当然没有问题,但对于异步操作,就不太合适了。目前的解决方法是,Generator 函数里面的异步操作,返回一个 Thunk 函数或者 Promise 对象,即value属性是一个 Thunk 函数或者 Promise 对象,等待以后返回真正的值,而done属性则还是同步产生的。

ES2018 引入了”异步遍历器“(Async Iterator),为异步操作提供原生的遍历器接口,即valuedone这两个属性都是异步产生。

  async function f() {
    for await (const x of createAsyncIterable(['a', 'b'])) {
      console.log(x);
    }
  }
  // a
  // b
  async function* gen() {
    yield 'hello';
  }
  const genObj = gen();
  genObj.next().then(x => console.log(x));
  // { value: 'hello', done: false }
  async function* gen1() {
    yield 'a';
    yield 'b';
    return 2;
  }
  
  async function* gen2() {
    // result 最终会等于 2
    const result = yield* gen1();
  }
上一篇下一篇

猜你喜欢

热点阅读