我一直在看这个与事件循环工作有关的精彩视频
https://www.youtube.com/watch?v=8aGhZQkoFbQ

从一些阅读中,我想process.nextTick会将回调放在事件队列的最开始。我也看到有人使用nextTick立即执行函数

我尝试编写一些代码来确认

function printNextTick(s){
    process.nextTick(function(){
        console.log(s)
    })
}
for (var i=0;i<5;i++){
    printNextTick(i)
}


我期望的是4,3,2,1,0,因为
nextTick始终将回调放置在队列的开头,并且脚本是“执行完成”,这意味着在“将回调放入队列”期间将不执行任何回调,“ 4”被压入最后,因此脚本完成后,“ 4”应该放在队列的第一位,这就是为什么我希望“ 4”首先出现

但这是不正确的

===============================更新================= ===================
这是新代码

function printNextTick(s){
    process.nextTick(function(){
        console.log("nextTick : "+s)
    })
}
function printTimeout(s){
    setTimeout(function(){
        console.log("timeout : "+s)
    },0)
}
for (var i=0;i<5;i++){
    printTimeout(i)
}
for (var i=0;i<5;i++){
    printNextTick(i)
}
//nextTick : 0
//nextTick : 1
//nextTick : 2
//nextTick : 3
//nextTick : 4
//timeout : 0
//timeout : 1
//timeout : 2
//timeout : 3
//timeout : 4


只是想知道为什么有些人将nextTick视为immediate最初,我想nextTick会将回调放在event queue的开头而不是正常结束,所以现在,我想nextTick的队列有一个优先级高于其他队列,至少高于timeout的队列

==================更新===============

上面不是真的!
以下代码的结果是不可预测的

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

最佳答案

您传递给process.nextTick()的所有回调都将附加到内部队列中,该内部队列按顺序在“下一个滴答”中被刷新(以最大IIRC的速度,以免完全耗尽事件循环的其余部分)。因此,在您的示例中,您首先要添加一个打印'0'的回调,然后添加一个打印'1'的回调,依此类推。然后依次执行这些操作,您会看到以数字顺序打印的数字。

关于node.js - 是process.nextTick()立即执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39402798/

10-09 21:21