代码之家  ›  专栏  ›  技术社区  ›  Ben Aston

异步生成器函数中是否需要等待?

  •  0
  • Ben Aston  · 技术社区  · 6 年前

    MDN有 an example 其中生成器函数标记为 async yield 使用时没有 await

    为什么 等待

    const myAsyncIterable = {
        async* [Symbol.asyncIterator]() {
            yield "hello"
            yield "async"
            yield "iteration!"
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   CertainPerformance    6 年前

    只是因为函数是 async 并不意味着 await 只是为了表明您可以轻松地插入 等待 艾德答应了。

    Symbol.asyncIterator 可以异步迭代 ,但它没有 有 财产,还有一切都很好:

    const myAsyncIterable = {
        *[Symbol.asyncIterator]() {
            yield "hello"
            yield "async"
            yield "iteration!"
        }
    };
    
    (async () => {
      for await (const item of myAsyncIterable) {
        console.log(item);
      }
    })();

    从规范来看,从对象检索迭代器之后,迭代器是同步的还是异步的并不重要。异步生成器函数将生成异步迭代器;同步生成器函数将生成同步迭代器。参见规范的最后步骤7 here - GetIterator 将被调用,以及 将被返回,如果它存在,不管它是否实际异步。

    使用迭代器,当使用 for await , each value returned by the iterator will be await ed :

    b、 如果iteratorKind是异步的,那么将nextResult设置为? Await(nextResult) .

    完全可以 有些事不是承诺,只是奇怪:

    (async () => {
      const item = await 'foo';
      console.log(item);
    })();

    等待 将打开一个承诺,如果其权利的表达是一个承诺,并将保持不变,否则。