异步遍历器
异步遍历器
  同步遍历器的问题
    Iterator 协议里面next()方法只能包含同步操作
    目前的解决方法是，将异步操作包装成 Thunk 函数或者 Promise 对象，即next()方法返回值的value属性是一个 Thunk 函数或者 Promise 对象，等待以后返回真正的值，而done属性则还是同步产生的
    ES2018 引入了“异步遍历器”（Async Iterator），为异步操作提供原生的遍历器接口，即value和done这两个属性都是异步产生
  异步遍历的接口
    异步遍历器的最大的语法特点，就是调用遍历器的next方法，返回的是一个 Promise 对象。
  for await...of
    for...of循环用于遍历同步的 Iterator 接口
    新引入的for await...of循环，则是用于遍历异步的 Iterator 接口
  异步 Generator 函数
    就像 Generator 函数返回一个同步遍历器对象一样，异步 Generator 函数的作用，是返回一个异步遍历器对象
    在语法上，异步 Generator 函数就是async函数与 Generator 函数的结合
  yield* 语句
    yield*语句也可以跟一个异步遍历器
    与同步 Generator 函数一样，for await...of循环会展开yield*
  async function* gen() {
yield 'hello';
}
const genObj = gen();
genObj.next().then(x => console.log(x));
// { value: 'hello', done: false }
  async function f() {
for await (const x of createAsyncIterable(['a', 'b'])) {
console.log(x);
}
}
// a
// b
  async function* gen1() {
yield 'a';
yield 'b';
return 2;
}
async function* gen2() {
// result 最终会等于 2
const result = yield* gen1();
}
  asyncIterator
.next()
.then(
({ value, done }) => /* ... */
);