gpt4 book ai didi

javascript - setImmediate() 函数在 setTimeout() 函数之后调用

转载 作者:数据小太阳 更新时间:2023-10-29 04:49:12 26 4
gpt4 key购买 nike

在 nodejs 的官方网站(https://nodejs.org/api/timers.html#timers_setimmediate_callback_arg)中,据说:

setImmediate() function schedules "immediate" execution of callback after I/O events' callbacks and before timers set by setTimeout and setInterval are triggered.

但是在下面的代码中,setTimeout() 函数在 setImmediate() 之前执行。为什么?

setImmediate(function A() {
setImmediate(function B() {
console.log(1);
setImmediate(function D() { console.log(2); });
setImmediate(function E() { console.log(3); });
});
setImmediate(function C() {
console.log(4);
setImmediate(function F() { console.log(5); });
setImmediate(function G() { console.log(6); });
});
});

setTimeout(function timeout() {
console.log('TIMEOUT FIRED');
}, 0)

结果:

TIMEOUT FIRED142356

I write another example, and setTimeout works before setImmediate here too.

setTimeout(function timeout() {
console.log('TIMEOUT-1 FIRED');
}, 0)

setTimeout(function timeout() {
console.log('TIMEOUT-2 FIRED');
}, 0)

setImmediate(function D() { console.log(1); });
setImmediate(function D() { console.log(2); });
setImmediate(function D() { console.log(3); });

setTimeout(function timeout() {
console.log('TIMEOUT-1 FIRED');
}, 0)

setTimeout(function timeout() {
console.log('TIMEOUT-2 FIRED');
}, 0)

输出:

TIMEOUT-1 FIREDTIMEOUT-2 FIREDTIMEOUT-1 FIREDTIMEOUT-2 FIRED123

最佳答案

让我们把上面的例子写成下面这样:

var fs = require('fs')

fs.readFile("readme.txt", function (){
setTimeout(function timeout() {
console.log('TIMEOUT-1 FIRED');
}, 0)

setTimeout(function timeout() {
console.log('TIMEOUT-2 FIRED');
}, 0)

setImmediate(function D() { console.log(1); });
setImmediate(function D() { console.log(2); });
setImmediate(function D() { console.log(3); });

setTimeout(function timeout() {
console.log('TIMEOUT-1 FIRED');
}, 0)

setTimeout(function timeout() {
console.log('TIMEOUT-2 FIRED');
}, 0)})

输出:

1
2
3
TIMEOUT-1 FIRED
TIMEOUT-2 FIRED
TIMEOUT-1 FIRED
TIMEOUT-2 FIRED

解释:

定时器的执行顺序将根据调用它们的上下文而有所不同。如果两者都是从主模块中调用的,那么时间将受到进程性能的限制(这可能会受到机器上运行的其他应用程序的影响)。例如,如果我们运行以下不在 I/O 周期内的脚本(即主模块),则两个计时器的执行顺序是不确定的,因为它受限于性能过程:

// timeout_vs_immediate.js
setTimeout(function timeout () {
console.log('timeout');
},0);

setImmediate(function immediate () {
console.log('immediate');
});
$ node timeout_vs_immediate.js
timeout
immediate

$ node timeout_vs_immediate.js
immediate
timeout

但是,如果您在一个 I/O 周期内移动这两个调用,则立即回调总是先执行:

// timeout_vs_immediate.js
var fs = require('fs')

fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout')
}, 0)
setImmediate(() => {
console.log('immediate')
})
})
$ node timeout_vs_immediate.js
immediate
timeout

$ node timeout_vs_immediate.js
immediate
timeout

与 setTimeout() 相比,使用 setImmediate() 的主要优势在于,如果在 I/O 周期内进行调度,setImmediate() 将始终在任何计时器之前执行,而与存在的计时器数量无关。

更多信息,请引用以下链接: https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md

关于javascript - setImmediate() 函数在 setTimeout() 函数之后调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38076585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com