该HTML5 规范,各国setTimeout可以在不这是应该经过多少毫秒将函数"处理程序"被安排说额外的"超时"的说法来运行.
handle = window . setTimeout( handler [, timeout [, arguments ] ] )
Schedules a timeout to run handler after timeout milliseconds. Any arguments are passed straight through to the handler.
Run Code Online (Sandbox Code Playgroud)
但是,我没有找到解释当没有设置"超时"时间段时会发生什么的任何地方.
一个示例用法是Raphael库中的动画实现.
animationElements[length] && win.setTimeout(animation);
Run Code Online (Sandbox Code Playgroud) 我对 Node.js 文档的以下段落感到困惑。
setImmediate()与setTimeout()...定时器的执行顺序将根据调用它们的上下文而变化。如果两者都是从主模块内部调用的,那么计时将受到进程性能的约束(这可能会受到计算机上运行的其他应用程序的影响)。
例如,如果我们运行以下不在 I/O 周期(即主模块)内的脚本,则两个计时器的执行顺序是不确定的,因为它受到进程性能的约束:
接下来显示以下示例
// timeout_vs_immediate.js
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
Run Code Online (Sandbox Code Playgroud)
$ node timeout_vs_immediate.js
timeout
immediate
$ node timeout_vs_immediate.js
immediate
timeout
Run Code Online (Sandbox Code Playgroud)
我不明白是什么导致结果不确定。由于该timers阶段发生在该check阶段之前,因此安排的回调不应该setTimeout总是在安排的回调之前执行吗setImmediate?我认为事件循环中的阶段顺序不会因为上下文切换或其他原因而改变。
该文件还指出
但是,如果在一个 I/O 周期内移动这两个调用,则始终先执行立即回调:
好的,但是所谓的“I/O 周期”与主模块有何不同?
我知道有很多相关的问题,但所有答案都只是通过引用文档来陈述这一事实,而没有解释非确定性在哪里发挥作用,所以我认为这不是重复的。
采取以下来自nodejs事件循环文档的代码:
// timeout_vs_immediate.js
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
Run Code Online (Sandbox Code Playgroud)
根据文档:
例如,如果我们运行以下不在I / O周期(即主模块)内的脚本,则执行两个计时器的顺序是不确定的,因为它受进程性能的约束。
为什么上述说法是正确的?是因为nodejs运行时实际上使用了多个线程来挑选必须执行的回调。
我的直觉是什么:有两个线程为setTimeout和执行回调setImmediate因此,当都可用时,这会导致竞争状态,因此输出将是不确定的。
这是对的吗 ?还是有其他原因导致不确定性?
不能理解一件事。在服务器上,我有一些以异步模式永远运行的进程。例如像这样:
function loginf() {
console.log(1+1);
process.nextTick(loginf);
}
loginf();
Run Code Online (Sandbox Code Playgroud)
它的 recusrion,据我所知,它必须导致堆栈溢出和(或)占用内存。如何在node.js中永久运行而没有内存泄漏?是否可以?
node.js ×4
javascript ×3
event-loop ×2
asynchronous ×1
callback ×1
loops ×1
setimmediate ×1
settimeout ×1