小弟不解,Nodejs中generator和async的本质区别是什么

发布于 1周前 作者 songsunli 来自 nodejs/Nestjs

小弟不解,Nodejs中generator和async的本质区别是什么
大神在哪里

6 回复

js 吗?

generator 原意是生成器 作为无限数组来使用

后来发现 generator 配合 Promise 可以非常方便的解决异步回调的问题 于是 generator 就被用来做异步处理了 比如 koaJS 这个框架

再后来发现 不行啊 generator 语义上原本就不是用来做异步处理的 但是这个实在太好用了 于是 ES2016 就把 generator 处理异步的分发重新封装了一下 改进了下语法 改成了 async 和 await 的形式

所以这大概就是他们俩的关系


generator 的语义,远远没有 async / await 直观好理解吧

Python 里的 generator 感觉像 static 函数,保存上下文

async 和 await 是用来多线程的

大概吧

= =! python 里的 generator 和 static 以及保存上下文完全是三个东西啊
保存上下文的概念是闭包
generator 就是一个可迭代的元素 当然你可以加入闭包的功能
static 是类上的公有方法

在Node.js中,generatorasync/await都是用于处理异步编程的机制,但它们在工作原理和使用方式上有着本质的区别。

Generator

Generator函数使用function*声明,并且可以通过yield关键字暂停和恢复执行。它们主要用于手动控制异步流程,通过调用.next()方法来逐步推进执行。

function* gen() {
  const result = yield fetchData(); // 暂停执行,等待fetchData()完成
  console.log(result);
}

const g = gen();
g.next().value.then(data => g.next(data));

Async/Await

async/await是基于Promise的异步编程语法糖,使异步代码看起来和同步代码几乎一样。async函数返回一个Promise,而await关键字用于等待一个Promise完成,并返回其结果。

async function asyncFunc() {
  const result = await fetchData(); // 等待fetchData()完成,然后继续执行
  console.log(result);
}

asyncFunc();

本质区别

  1. 控制流:Generator需要手动调用.next()来控制执行流程,而async/await是自动控制的,更符合直觉。
  2. 错误处理:Generator需要手动捕获和传递错误,而async/await可以直接使用try...catch进行错误处理。
  3. 可读性async/await语法更简洁,可读性更高,更适合复杂的异步逻辑。

总结来说,async/await是现代JavaScript中处理异步编程的首选方式,因为它更简洁、更易于理解和维护。

回到顶部