什么是“异步*”?

What is `async*`?

This example on MDN 说明 Symbol.asyncIterator

 const myAsyncIterable = {
    async* [Symbol.asyncIterator]() {
        yield "hello";
        yield "async";
        yield "iteration!";
    }
};

(async () => {
    for await (const x of myAsyncIterable) {
        console.log(x);
        // expected output:
        //    "hello"
        //    "async"
        //    "iteration!"
    }
})();

我的问题是 async* 在代码中是什么意思?

给出的示例使用 shorthand 在对象文字或 类 中创建方法。考虑以下对象定义:

const iHaveAMethod = {
  myMethod() {
    return "cool!";
  }
};
console.log(iHaveAMethod.myMethod()); // cool!

它还使用括号语法来定义使用符号的方法。

const iAmASymbol = Symbol("neat");
const iHaveAMethod = {
  [iAmASymbol]() {
    return "cool!";
  }
};
console.log(iHaveAMethod[iAmASymbol]()); // cool!

它在作为生成器的对象上创建一个方法(使用 * 语法)。

const iHaveAMethod = {
  * myMethod() {
    yield "cool!";
  }
};
console.log(iHaveAMethod.myMethod().next().value); // cool!

最后,它是一个异步方法,因此标有async

const iHaveAMethod = {
  async* myMethod() {
    yield Promise.resolve("cool!");
  }
};
iHaveAMethod.myMethod().next().then(val => console.log(val.value)); // cool!

将它与括号语法结合起来,你会得到 async*:

const iAmASymbol = Symbol("neat");
const iHaveAMethod = {
  async* [iAmASymbol]() {
    yield Promise.resolve("cool!");
  }
};
iHaveAMethod[iAmASymbol]().next().then(val => console.log(val.value)); // cool!

这解释了 async* 是如何到达那里的。异步迭代器和为什么你想要一个异步生成器是一个完全不同的蜡球。