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

问题描述 投票:0回答:1
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?

在解决承诺之前,承诺响应会发生什么?

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

javascript node.js v8
1个回答
0
投票

here在事件循环上有不错的读物。

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

您上面共享的代码由于nodejs的单线程设计而无法全局使用。 nodejs的作用是,每次调用函数时,它将被推入队列并进行处理。在每个滴答声中,您都会从队列中弹出某些内容并运行它或推送新内容。

在js世界中,没有2件事可以同时运行。如果您运行长时间的js代码,它将阻止整个系统,因此由于eventloop被阻止,因此您的系统不会响应新事件。

那就是说,当您运行所有这些非阻塞函数时,故事的另一面是在v8 js引擎中对它们进行了后台处理。自v8本机代码以来,它可以利用多个线程之类的东西,等待事物完成或轮询事物,以检查事物是否准备就绪以及事物是否准备就绪,新消息将重新插入js事件循环中,从而可以访问数据在js世界中。

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

没有真正的等待,并且等待的重点不是用阻塞的本机函数来阻塞事件循环,而不是将执行权交给其他事情,而异步函数最终会返回Promise,如果您使用.then并添加一个回调,以便在数据准备好时将其传递回js world,则是很有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.