首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js事件队列、承诺和setTimeout() --按什么顺序?

Node.js事件队列、承诺和setTimeout() --按什么顺序?
EN

Stack Overflow用户
提问于 2021-09-15 15:36:57
回答 1查看 595关注 0票数 1

简介:

在Node.js事件队列中,以及像“新承诺((R) => setTimeout(r,t))”这样的代码中,setTimeout()现在是在承诺解析的微队列中计算的吗?

详细信息:

我正在用Node.js阅读分布式系统(Thomas,O‘’Reilly,第一版第3版)。它告诉我,Node.js依次遍历每个队列:

多数情况下,包括I/O callbacks

  • Check: for setImmediate callbacks

  • Close:在关闭connections

  • Timers:时setTimeout和setInterval resolve

  • Pending:特殊系统事件

在每个队列为空后,也有两个微队列进行评估,一个用于承诺,一个用于nextTick()。

在书的第13页,他有一个例子,其中一个等待调用函数返回“新的承诺((R) => setTimeout(r,t))”。书码是:

代码语言:javascript
复制
const sleep_st = (t) => new Promise((r) => setTimeout(r, t));
const sleep_im = () => new Promise((r) => setImmediate(r));
  
(async () => {
  setImmediate(() => console.log(1));
  console.log(2);
  await sleep_st(0);
  setImmediate(() => console.log(3));
  console.log(4);

那是,

代码语言:javascript
复制
setImmediate(() => console.log(1));
console.log(2);
Promise.resolve().then(() => setTimeout(() => {
  setImmediate(() => console.log(3));
  console.log(4);

这就是我所认为的情况:

  1. 程序从Poll队列中的一个任务开始,即p.13代码。它开始运行。

  1. 检查队列获得一个任务,并将"2“打印到控制台.

  1. “等待sleep_st(0)”将调用setTimeout,它将任务放置在计时器队列中。由于超时为零,所以当我们访问计时器队列时,将有工作要做。sleep_st(0)返回一个承诺.

  1. --这结束了Poll队列的工作.

  1. 现在启动结果微队列。我的代码将继续执行。这应该从console.log(4).

()和setImmediate()开始

这意味着控制台的输出为“2.4”。然而,书中说,正确的顺序是"2,14,3“。也就是说,涉及到用于检查的事件队列,也许还有计时器。

那么,在承诺结果微队列中会发生什么呢?

EN

回答 1

Stack Overflow用户

发布于 2022-02-12 14:19:10

,当我们访问计时器队列时,将有工作要做

在进入计时器阶段之前,有检查阶段,所以"1“被打印在"3”之前,但是我在我的窗口上执行了代码,结果是2 4 1 3,即setTimeout和setImmediate将竞相执行,有时是setTimeout第一次,有些时候是第二次,我在短期内多次执行了本书中的示例代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69196083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档