【问题标题】:What is `async*`?什么是`async*`?
【发布时间】:2021-10-31 07:49:46
【问题描述】:

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* 是什么意思?

【问题讨论】:

  • async* 在您的示例中使用,因为它是一个异步函数(请参阅 What is the meaning of the async keyword? 作为对象文字中方法定义的一部分,它不需要 function 关键字。
  • 虽然所有链接的问题都相关,但我不同意这个问题与其中任何一个问题重复。他们都没有解决async*Symbol.asyncIterator的具体用例。
  • @HereticMonkey 生成器函数和函数在工作方式上绝对不一样。该术语实际上是不可互换的。而且异步迭代器协议也不仅仅是你可以说“它只是一个函数”的东西。您的评论非常过于简单化了。

标签: javascript symbols


【解决方案1】:

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

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* 是如何到达那里的。异步迭代器以及为什么需要异步生成器是完全不同的蜡球。

【讨论】:

  • 一个小问题,yield Promise.resolve(value) 与异步上下文中的yield value 相同。否则很好的解释。
猜你喜欢
  • 2020-06-26
  • 1970-01-01
  • 2016-06-02
  • 2018-01-02
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多