为什么server.listen 和 setTimeout 可以让 node进程保持运行
发布于 8小时前 作者 newcallback 85 次浏览 最后一次编辑是 3小时前 来自 问答

情况一

写一个 js 文件 test.js

    var EventEmitter = require('events').EventEmitter
    var e = new EventEmitter()
    e.on('test', function(){
        console.log('test')
    })

然后 node test ,控制台会瞬间退出。

情况二

test2.js 里有

    http.createServer(function(){
    }).listen(8080)

然后运行,一直没有退出。

情况三

test3.js 里有

    setTimeout(function(){
    }, 3000)

然后运行,3秒后才会退出

疑问

《node.js 深入浅出》这样写道:

在进程启动时,Node便会创建一个类似于while(true)的循环,每执行一次循环体的过程我们称为Tick。每个Tick的过程就是查看是否有事件待处理,如果有,就取出事件及其相关的回调函数。如果存在关联的回调函数,就执行它们。然后进入下个循环,如果不再有事件处理,就退出进程

  1. 这里的“查看是否有事件待处理”,是指有事件被触发吗?如果是的话,情况二和情况三的前3秒,好像没有事件被触发,为什么可以一直维持不退出?
  2. 情况二和情况三的进程没有退出,是因为每个 tick 的过程都有事件待处理吗?如果有的话是什么事件呢?
4 回复

@alsotang 老师也可以帮忙解答一下啊,说说你的理解,朴老师好像不经常来。

还有 @jiyinyiyong 老师

@newcallback 具体我不是很懂…只是我发现,如果全局中有事件等待处理的时候,node 进程是不会退出的

好问题,说下我的理解

首先每次tick本身就会触发一个事件,node在每次循环首先检查是否存在tick事件的callback(通过process.nextTick或者更底层的方法添加),然后检查是否存在其它触发事件并调用其callback,如果两者都不存在则退出进程

2和3是在tick事件上绑定了callback 2在每次tick检查是否有客户端连接之类的,有则执行传入http.createServer的callback 3在每次tick检查计时是否结束,若结束则执行传入setTimeout的callback,然后移除tick事件的callback

回到顶部