Node.js process.nextTick()是否立即执行
我已经观看了这段与活动循环工作有关的精彩视频 通过阅读,我认为Node.js process.nextTick()是否立即执行,node.js,asynchronous,Node.js,Asynchronous,我已经观看了这段与活动循环工作有关的精彩视频 通过阅读,我认为process.nextTick会将回调放在事件队列的最开头。我还看到一些人使用nextTick立即执行函数 我试着写一些代码来确认它 function printNextTick(s){ process.nextTick(function(){ console.log(s) }) } for (var i=0;i<5;i++){ printNextTick(i) } 只是想知道为什
process.nextTick
会将回调放在事件队列的最开头。我还看到一些人使用nextTick
立即执行函数
我试着写一些代码来确认它
function printNextTick(s){
process.nextTick(function(){
console.log(s)
})
}
for (var i=0;i<5;i++){
printNextTick(i)
}
只是想知道为什么有些人将nextTick
视为immediate
最初,我想nextTick
会将回调放在事件队列的开头,而不是正常结束,现在,我想nextTick
的队列比其他队列具有更高的优先级,至少高于队列的超时时间
=========================更新===============
上面不是真的!
下面代码的结果是不可预测的
function printNextTick(s){
process.nextTick(function(){
console.log("nextTick : "+s)
})
}
function printTimeout(s){
setTimeout(function(){
console.log("timeout : "+s)
for (var i=0;i<5;i++){
printNextTick(i)
}
},0)
}
for (var i=0;i<5;i++){
printTimeout(i)
}
函数printNextTick(s){
process.nextTick(函数(){
console.log(“nextTick:+s)
})
}
函数printTimeout(s){
setTimeout(函数(){
日志(“超时:+s)
for(var i=0;i传递给process.nextTick()
的任何回调都会按顺序附加到一个内部队列中,该队列会被刷新(达到最大IIRC,以免完全耗尽事件循环的其余部分)因此,在你的例子中,你首先添加一个回调,打印出代码“>‘0’/CODE,然后是一个回调,打印出<代码>‘1’/代码>等,然后按顺序执行,你可以看到数字按数字顺序打印。< P>)了解NeXTICK和SETTIMEOUT之间的差异,考虑我的SETTIMEOUT:
function setTimeout2(callback, ms) {
var t = process.hrtime(),
_next = () =>
process.nextTick(process.hrtime(t)[0] > !!ms?callback:_next);
_next();
}
function printNextTick(s){
process.nextTick(() => console.log('n'+s))
}
function printTimeout(s){
setTimeout2(() => {
console.log('t'+s);
for (var i=0;i<5;i++)
printNextTick(s+':'+i);
});
}
for (var i=0;i<5;i++)
printTimeout(i);
函数setTimeout2(回调,毫秒){
var t=process.hrtime(),
_下一步=()=>
process.nextTick(process.hrtime(t)[0]>!!ms?回调:_next);
_next();
}
函数printNextTick(s){
process.nextTick(()=>console.log('n'+s))
}
函数printTimeout(s){
setTimeout2(()=>{
控制台日志('t'+s);
对于(var i=0;i=ms)。只是想知道为什么有些人认为nextTick是即时的
process.nextTick()在同一阶段立即启动
setImmediate()在以下迭代或事件循环的“勾选”时激发
本质上,名称应该交换。process.nextTick()比setImmediate()更直接地激发但这是过去的产物,不太可能改变。进行此切换将破坏npm上的大部分包。每天都有更多的新模块被添加,这意味着我们等待的每一天,都会发生更多潜在的破坏
最初,我假设nextTick会将回调放在事件队列的开头,而不是像正常情况那样结束,现在,我假设nextTick的队列比其他队列具有更高的优先级,至少比timeout队列的优先级更高
process.nextTick()在任何其他I/O事件(包括计时器)之前运行
为什么许多人将nextTick
视为等同于immediate
.现在,我假设NodeJ维护多个“事件队列”,而用于nextTick
的“事件队列”具有更高的优先级。它们可能会以类似的方式对待它们,因为它们或多或少具有相同的预期效果(例如,允许调用堆栈展开,并让用户有机会在立即发出事件之前附加事件处理程序).现在,虽然(IIRC)process.nextTick()
回调在同一个刻度上被触发,但在I/O回调发生之前。setImmediate()
回调实际上在下一个刻度开始时被调用。这有点令人困惑,但随着时间的推移,行为发生了变化(和setImmediate()
在node的生活中出现的时间要晚得多)。只是想知道为什么有些人将nextTick
视为直接的人?这些人是谁?不是“直接的”,而是“下一个”。可能是@torazaburo的重复您提到的答案是错误的,我更新了它
function setTimeout2(callback, ms) {
var t = process.hrtime(),
_next = () =>
process.nextTick(process.hrtime(t)[0] > !!ms?callback:_next);
_next();
}
function printNextTick(s){
process.nextTick(() => console.log('n'+s))
}
function printTimeout(s){
setTimeout2(() => {
console.log('t'+s);
for (var i=0;i<5;i++)
printNextTick(s+':'+i);
});
}
for (var i=0;i<5;i++)
printTimeout(i);