问题标签 [setimmediate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
886 浏览

javascript - 为什么 Node.js setImmediate 在 I/O 回调之后执行?

作为新成员,我无法对主题发表评论,这就是为什么我必须创建一个新主题。但是通过这种方式,我可以澄清问题,所以希望你们能帮助我。

我已经阅读了很多关于 Node.js 事件循环的内容。我根据以下材料形成了我对它的理解:

Node.js 事件循环 事件循环
到底是什么?
为什么在 Nodejs Event Loop 的作品中 setImmediate() 在 fs.readFile() 之前执行?

(请随时建议其他信息丰富且准确的材料)

尤其是第三个环节,让我有了更好的理解。但请记住这一点,我无法理解以下代码的事件循环行为:

令人惊讶的是,对我来说输出如下:

我的终端的屏幕截图,显示输出以及
来自在线代码编译器 rextester.com 的输出的节点版本屏幕截图

记住事件循环,我猜流程应该如下:

  1. 解释器首先启动两个 stat 操作。
  2. 解释器入队 setImmedate 队列中的 setImmedate 回调(事件)
  3. 调用堆栈记录记录器
  4. I/O Poll 阶段之前的所有事件队列都是空的,所以 Event Loop(EL) 继续进行
  5. 在 I/O 轮询阶段,EL 收集事件并将 fs.stat 回调排入“运行完成的 I/O 处理程序”阶段
  6. EL 检查 Check 阶段,并运行 setImmediate 回调
  7. 本轮EL结束,第二轮开始
  8. 在“运行完成的 I/O 处理程序”中,EL 运行两个回调(它们的顺序可以是 onn-determinstic)

问题 1:我的分析/预测的哪一部分是错误的?

问题 2:Event Loop 什么时候开始工作?它是否从应用程序的开头(即第 1 阶段)开始?还是在解释器读取整个代码后启动,所有同步任务都在调用堆栈内完成,调用堆栈需要更多任务,即在阶段 3-4 之间?

提前致谢,

0 投票
0 回答
1336 浏览

javascript - setImmediate 是在异步 setState 更新后使用 jest 进行测试的一个很好的解决方案吗?

我一直在使用以下模式在我的组件中使用react.

这很好用并且保证可以工作,但是写起来很痛苦而且很冗长。

我一直在研究可能使用setImmediate而不是setInterval. 这将阻止轮询(并允许我测试当前不可能的否定断言,而无需使用try/引入另一个级别的详细程度catch),但是否可以保证使用react异步机制,例如setState

例如,如果react决定批量尝试批量处理一些 setState 事件或类似的事情,并在调度状态更新操作setImmediate之前放入事件循环队列中,会发生什么?react

我不想在我的测试中引入片状。

0 投票
1 回答
60 浏览

node.js - 为什么 setImmediate() 比顺序代码运行得更快?

我正在学习 setImmediate() 的工作原理,并且遇到了一个我无法找到技术解释的奇怪现象。

代码非常简单:

不管我运行多少次这段代码,总的结果都是一样的,即:

顺序代码的时间(“第一次”和“第二次”打印之间)似乎比“第二次”和“第三次”打印之间的时间长 3 倍。

让我提供 3 个示例输出来说明这一点:

示例 1

第一到第二需要 0.0033 秒

第二到第三需要 0.0012 秒(= 快 3 倍)

示例 2

第一到第二需要 0.0034 秒

第二到第三需要 0.0012 秒

示例 3

第一到第二需要 0.0032 秒

第二到第三需要 0.0013 秒

因此?

考虑到 setImmediate 在下一个事件循环中发生的事实,有没有人知道为什么 2 行连续的代码(“第一和第二”)比分开的代码行(“第二和第三”)长 3 倍通过 setImmediate() 的不同事件循环?

0 投票
0 回答
106 浏览

javascript - 尝试查找 node express 阻塞的 cpu 代码,并希望使 express 处理程序异步以进行堆栈跟踪

我有 node10 express 应用程序,例如:

但是有更多的路由和中间件。由于我遇到的阻塞问题,其中 cpu 正在处理某些事情并且“没有响应”几秒钟,我添加了https://github.com/naugtur/blocked-at/blob/master/README.md模块。但它为我提供的大部分堆栈跟踪都是以at Server.connectionListener (_http_server.js:319:3),.... 在自述文件中,它谈到了这一点: In some cases your code is not directly called and tracking it down will still be difficult. See how the HTTP test case produces a stack pointing to Server.connectionListener as the slow function, because everything inside of it is synchronously called. You can always wrap your handlers' code in setImmediate if you become desperate. Or use resources.. 我知道我需要从另一个“来源”运行我的处理程序,该“来源”将从事件循环中的另一个任务开始(我可能措辞不好),但我真的不明白使用 setImmediate 的建议我能做什么. 我看到有一些 npm 库https://www.npmjs.com/package/express-async-handler用于错误处理,但我仍然不确定我的代码应该是什么样子(特别是因为我有很多处理程序和中间件)。我很乐意获得一些建议或一些代码片段,以了解如何获得更好的堆栈跟踪。

0 投票
2 回答
1351 浏览

javascript - 为什么我收到错误 clearImmediate 未定义?

我正在尝试制作一个在上传视频时停止的不定式循环。该功能工作正常,但是停止循环似乎不起作用。我得到的错误是:

clearImmediate 未定义

这是我想要做的循环:

Azure 上传视频后,它会设置“videoIsUploaded = true”,这一切正常,“if (videoIsUploaded ...”会触发

0 投票
1 回答
702 浏览

javascript - 如何在 Node 中承诺和等待 setImmediate?

我一直在阅读有关如何不阻止 Node 的事件循环的信息。避免阻塞的一种方法是使用分区

我试图在我的代码中使用分区循环,但我似乎无法等待我的循环。这是我的代码的简化版本:

这将返回“Report is { someValue: 1 }”,但我希望 someValue 为 1000。

我猜 setImmediate 不会返回承诺,所以我尝试过承诺:

但这也会返回“Report is { someValue: 1 }”。

那么,我怎样才能等待这个递归 setImmediate “循环”,以便我仅在整个递归周期完成后才进行 console.log 报告?

0 投票
1 回答
764 浏览

typescript - 笑话:await vs setImmediate vs useFakeTimers vs new Promise(setImmediate)

以下是 TypeScript 中的 Jest 测试。我想知道为什么需要 setImmediate() 。

第一个例子是一个有效的测试。接下来是我尝试过的各种不起作用的东西。我不明白发生了什么。pubsub.publish 的签名是: (method) PubSub.publish(triggerName: string, payload: any): Promise<void>

所以这些是我尝试过的其他事情,有些是在研究了类似问题的答案之后。所有这些尝试都失败,并在测试中出现超时异常:

我知道 setImmediate 在事件循环中放置了一个函数,以便在任何挂起的 I/O 事件之后立即执行。我不确定为什么需要它,因为 pubsub.publish() 返回一个可以用await处理的 Promise ,但在这种情况下会发生下一行await sub.next()永远不会被调用。

我的想法是在 pubsub.publish() 中有一个 setInterval 调用,并且 setImmediate 等待任何未决的 setInterval 事件完成(我对此的理解很模糊)。尝试 3 和 3a 是我在其他地方找到的用于执行此操作的机制,但在这种情况下它们似乎不起作用。

问题:为什么这个测试需要 setImmediate 才能通过?

0 投票
1 回答
369 浏览

javascript - Nodejs setImmediate() 函数实时用例和示例

有人可以解释一下 nodejs 中 setImmediate() 函数的实时用例吗。我浏览了很多博客,但每个地方都给出了带有 setImmediate 的 console.log 示例。

0 投票
1 回答
98 浏览

java - 如何计算 android studio 应用中一段文本的阅读时间。(使用java)同中篇

如何计算 android studio 应用中一段文本的阅读时间。(使用java)与中篇文章相同。示例图像如下所示。

我使用 textview 来显示文本。在此处输入图像描述

0 投票
1 回答
38 浏览

javascript - 当我用另一个类似的函数替换函数调用时,nodejs aync 函数需要更多时间

有人可以向我解释为什么当我运行以下代码时所需的时间更少:

并且对于

这两个函数中的普通 for 循环每次都需要大约 1500 毫秒

我第一次跑,longTsk3然后longTsk在这个屏幕截图中

我第一次在这个屏幕截图中运行 longTsk3 然后 longTsk

为什么用另一个类似的函数(longTsk3)替换第二个函数调用需要 500 毫秒以上?这个时间尺度可能会因机器而异,但是在同一台机器上运行的两种情况下肯定会有很大的时间差异!