javascript - 在异步生成器 JS 中处理同步流

标签 javascript async-await generator es6-promise

我正在我的逻辑中实现一个生成器,但我不清楚

function *generator {
    yield synchronousFunc()
    yield asyncFunc()
    // should wait till asyncFunc() is completed 
    // before calling next yield
    yield anotherSynchronousFunc() 
    yield ...
}

如果我将此 generator 转换为带有 async/await for 的 async generator,它将如何工作

for await (const item of generator()) {}

当大部分 yield 是同步的。

async generator 将如何在幕后处理 yield 的同步部分?

也许这是一个愚蠢的问题,但我正在尝试了解生成器的工作原理

最佳答案

您应该在生成器前面放置一个 async 关键字以将其转换为异步生成器。

这是一个你可以运行的例子

async function* asyncGenerator() {
  yield 1
  yield 2
  yield Promise.resolve(3)
  yield 4
  yield 5
}

(async () => {
  for await (const n of asyncGenerator()) {
    console.log(n)
  }
})()

This resource帮助我培养了对生成器和异步生成器的直觉。

关于异步生成器如何在幕后工作,它与生成器关系不大,而与异步和等待有关。这是 async/await under the hood

除非您在 redux-saga 生成器中运行大量 CPU 密集型工作负载,否则即使您的大部分代码是同步的,您也不必担心异步生成器发生的额外 promise 包装。

关于javascript - 在异步生成器 JS 中处理同步流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62041213/

相关文章:

javascript - 每 3 天倒数计时器

javascript - 在 Closure Linter 中启用 JSX

c# - httpclient 的 async wait 执行顺序问题

node.js - Async/Await Mongoose 并不总是正确运行

c# - c#代码的控制流图生成器

node.js - Koa 上下文中协程和生成器的区别?

javascript - 数字、日期和货币的国际化 (i18n) (JavaScript)

javascript - 当 # 已经添加到 url 时,如何使用 javascript 或 jquery 将焦点设置在 div 上?

c# - Xamarin.iOS 异步 ViewDidLoad

javascript - 如何在 n 秒后停用 MutationObserver?