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);