Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中的计时器有什么特别之处?_Javascript_Node.js_Timer_Event Loop - Fatal编程技术网

Javascript Node.js中的计时器有什么特别之处?

Javascript Node.js中的计时器有什么特别之处?,javascript,node.js,timer,event-loop,Javascript,Node.js,Timer,Event Loop,我想更好地理解事件循环。我阅读文档、文章、Node.js的API文档。几乎所有的计时器都是独立的: setImmediate(): setImmediate(回调[,arg][,…]) 安排“立即” 在I/O事件回调之后和setTimeout之前执行回调 和设置间隔 process.nextTick(): process.nextTick(回调[,arg][,…])# 这不是设置超时(fn,0)的简单别名,它更重要 有效率的它在任何其他I/O事件(包括 计时器)在事件循环的后续节拍中触发 为什么

我想更好地理解事件循环。我阅读文档、文章、Node.js的API文档。几乎所有的计时器都是独立的:

setImmediate():

setImmediate(回调[,arg][,…])

安排“立即” 在I/O事件回调之后和setTimeout之前执行回调 和设置间隔

process.nextTick():

process.nextTick(回调[,arg][,…])#

这不是设置超时(fn,0)的简单别名,它更重要 有效率的它在任何其他I/O事件(包括 计时器)在事件循环的后续节拍中触发


为什么??Node.js中的计时器函数在事件循环上下文中有什么特殊之处

这些都与对回调的异步执行进行真正细粒度的控制有关

nextTick()函数最快执行到调用它的位置。它的名字来自事件循环“tick”。勾号表示不同种类的事件(如计时器、io、网络)耗尽一次的完整循环。尽管现在的名称令人困惑,因为它改变了节点版本的语义。nextTick()回调在与调用代码相同的记号中执行。在nextTick()回调函数中添加更多的nextTick()会聚合它们,并在同一时间调用它们

setImmediate()给出第二个最近的执行。它几乎与setTimeout(0)相同,但它是在所有传统的setTimeout()和setInterval()计时器之前调用的。它在下一个勾号开始时作为第一件事处理。您可以获得某种异步执行的快车道,它比传统的setInterval()和setTimeout()具有特权。在setImmediate()本身中添加更多的setImmediate()回调会将它们延迟到下一个刻度,并且与nextTick()的执行方式不同,它们不会在同一个刻度中执行。此setImmediate()功能最初是nextTick()的语义,因此命名为nextTick()


setTimeout()setInterval()按预期工作,具有第三个最近的执行点(如果超时时间较长,则更晚)

简单地说,他们调用的顺序是:nextTick()-->setImmediate()-->setTimeout(fn,0)

我认为这只是为了在事件循环中建立优先级。“计时器函数有什么特别之处”-嗯,它们是定时的,它们被作为参数指定了毫秒的时间。
process.nextTick()
setTimeout(fn,0)
更有效,因为它将函数延迟到调用下一个堆栈。@MaxMastalerz:“下一个堆栈”是什么?我如何知道在运行时的某个时刻我处于事件循环的哪个阶段?当我查看我的源代码时,我如何确定事件循环的次数?你不能确定,但没有任何变化。所有这些仍然适用:如果您希望对回调执行的时间点进行细粒度控制,请从以下选项中选择最合适的函数:-如果nextTick()使用不当,则可能非常危险,使用setImmediate()的方法是正确的,或者使用setTimeout(0)的旧方法。