当您等待解决 Node 中的承诺时会发生什么

What happens when you wait to resolve a promise in Node

const fetchPromise = fetch('example.com') // Takes 1 second to resolve
...
... // Do 3 seconds of work
...
const response = await fetchPromise // What happens with the promise between seconds 2-3?

在您 resolve promise 之前,promise 响应会发生什么情况?

在上面的示例中,如果您的程序在其调用堆栈中有项目,但您没有兑现承诺,那 2 秒内获取响应会发生什么情况? Node 是否为已完成但未解决的承诺提供某种缓存?

here关于事件循环的读物很棒。

从高层次的角度来看,有一个永远的 运行ning 循环以动作列表的形式侦听事件并一次处理一个事件。

由于nodejs的单线程设计,您上面分享的代码无法全局使用。 nodejs 所做的是,每次调用函数时,它都会被推入队列并进行处理。在你的每一个滴答声中,你从队列中弹出一些东西然后运行它或者推送一些新的东西。

在 js 世界中,没有 2 件事可以同时 运行。如果你 运行 一个很长的 运行ning js 代码,它会阻塞整个系统,因此你的系统不会响应新事件,因为 eventloop 被阻塞了。

也就是说,当您 运行 所有这些非阻塞函数都在 v8 js 引擎的幕后处理时,还有另外一面。由于 v8 本机代码,它可以使用诸如多线程之类的东西并等待事物完成或轮询事物以检查它们是否准备就绪并且事物已经准备就绪,将新消息插入回 js 事件循环中并且您可以访问数据在 JS 世界中。

因此,当您调用 await 时在异步函数中返回您的问题实际上只是意味着您将执行让给在消息队列中等待的其他事物,一旦您等待的事物准备就绪,它就会被推回到排队,你从你离开的地方继续。

并没有真正的等待,await 的目的不是用阻塞的本机函数来阻塞事件循环,而是将执行让渡给其他事情,而你在一天结束时使用异步函数 returns 一个 Promise,只有当你使用 .then 并添加一个回调以在数据准备好时传递回 js 世界时才有意义。