- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
希望对 node.js 执行模型的理解有一点确认。我知道当 node.js 进程启动时,这是执行顺序: (来自 Jonas Schmedtmann 的 Udemy node.js 类(class))
主要要点是顶层代码总是在任何回调之前首先执行。
经过一些挖掘,我还确认了为什么在主模块中调用的 setTimeout 和 setImmediate 具有“任意”执行顺序,但是当从 I/O 阶段调用时,setImmediate 将始终首先执行,基于这篇文章: https://github.com/nodejs/help/issues/392#issuecomment-274032320 .
(原因:假设计时器阈值已经过去,因为我们当前处于 I/O 阶段,之后的下一个阶段是执行 setImmediate 回调的检查处理阶段,immediate 总是在计时器之前执行。)
现在,当从一个阶段调用计时器和立即回调时,下一阶段是到期计时器阶段(例如从主模块),如果顶级代码花费的时间足够长以至于计时器到期,则计时器回调总是先执行,对吗?我用下面的代码对此进行了测试,它似乎是真的(每次我运行它时,计时器都会先执行,尽管与立即回调相比它有整整一秒的延迟)
setTimeout(() => {
console.log('timer completed');
}, 1000);
setImmediate(() => {
console.log('immediate completed');
});
for (let i = 0; i < 5000; i++) {
console.log(`top-level code: ${i}`);
}
所以这是我的问题:由于事件循环,I/O 操作回调是否也应该在立即回调之前执行,假设顶层代码花费足够长的时间 I/O 操作完成我们开始事件循环的时间?
但是,下面的代码表明情况并非如此,因为执行顺序始终是:top-levels->timer->immediate->io
即使基于上面的模型,我也应该期待:top-levels->timer->io->immediate (?)
setTimeout(() => {
console.log('timer completed');
}, 1000);
fs.readFile('test-file.txt', 'utf-8', () => {
console.log('io completed');
});
setImmediate(() => {
console.log('immediate completed');
});
for (let i = 0; i < 5000; i++) {
console.log(`top-level code: ${i}`);
}
谢谢!
最佳答案
我回答这个问题可能有点晚了,您可能已经想通了@M.Lee。但是这里是你问题的答案:
在顶层代码执行期间,您在示例中运行的代码并未在事件循环中运行。就像您问题中的第一张图片所示,事件循环将在顶层代码执行后开始计时。因此,当谈到顶层代码时,Node 不会遵循它在事件循环 tick 期间遵循的相同顺序。
在这种特殊情况下,I/O 回调最后执行显然是因为这个特殊文件的内容(顺便说一句,我不得不继续研究 Jonas 的 Node 类(class)和了解此文件包含的内容。它只包含一行“Node.js 是最好的!”一百万次)。
这里还有一个旁注是您正在使用异步 readFile
函数而不是 readFileSync
。
关于javascript - Nodejs 事件循环——与顶层代码的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60198686/
我正在开发一个需要多个窗口的程序,第一个出现的是登录窗口,我使用了 Toplevel 小部件以使其他窗口成为其子窗口,但这段代码一直显示两个窗口而不是一个。 from Tkinter import F
我不知道一般如何实现这一点,但为了清楚起见,我会特别询问一个实例: Sexplib 对我来说看起来很有趣。我想玩弄它。我已经下载了它,安装得很好(反正我很确定)等等。我想在顶层使用“with sexp
我在 makefile 中设置一个变量,如下所示: SOMEVAR = foo 此 makefile 稍后包含一些其他 makefile,在其中进行实际的程序构建: include generic/M
from tkinter import* import tkinter as tk def topLevel(): top=Toplevel() top.title("Listbox
我想查看乘法函数 (*) 的类型,因此我将其输入 OCaml 顶层。 # (*) 然而,顶层回应: (*);; 1: this is the start of a comment. 然后消耗我输入的任
我喜欢Try Ocaml的顶层行为:;; 在我按下 Enter 时隐式添加,并且我能够使用 Shift-Enter 进行多行编辑。 是否有可能在标准顶层或 utop 中获得相同的功能? 最佳答案 目前
我想知道,在 Ocaml 中,是否有部分输入信息。对于无法编译的程序,可以通过顶层/编译器的某些现有功能来绘制吗?让我解释。 在 Ocaml 中,众所周知,可以通过 -annot 文件检索推断类型。但
当我将分层 SVG 文件加载到 Illustrator 中时,所有图层都按其应有的方式工作,但它们始终位于新图层下;我没有指定“第 1 层”。 如何创建一个 SVG,使我的顶层最终也成为 Illust
我遇到了让我的 TreeView 填充已创建的顶层窗口的挑战,已尝试 fill=“x”和 fill=“both”,但没有得到结果。有任何建议这样做。 from tkinter import ttk i
标签在 div 中
我有以下布局: target target not target 我的问题是,如何定位所有顶级 标签(参见 target )使用 .fin
大家好,我有一个 div.mapFullscreenContainer #mapFullscreenContainer { position:fixed; top:0; lef
我有一个以编程方式创建的标签栏 Controller ,名为 TPastJourneyTabbar。当我单击 TableView 并调用 didSelectRowAtIndexPath: 时,我的选项
我是一名优秀的程序员,十分优秀!