开发手册 欢迎您!
软件开发者资料库

进程 | Node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

Node.js v8.x 中文文档


process - 进程#

process 对象是一个全局变量,它提供当前 Node.js 进程的有关信息,以及控制当前 Node.js 进程。因为是全局变量,所以无需使用 require()

process 事件#

process 对象是 EventEmitter 的实例。

'beforeExit' 事件#

当 Node.js 的事件循环数组已经为空,并且没有额外的工作被添加进来,事件 'beforeExit' 会被触发。正常情况下,如果没有额外的工作被添加到事件循环数组,Node.js 进程会结束。但是如果 'beforeExit' 事件绑定的监听器的回调函数中,含有一个可以进行异步调用的操作,那么 Node.js 进程会继续运行。

process.exitCode 作为唯一的参数值传递给 'beforeExit' 事件监听器的回调函数。

如果进程由于显式的原因而将要终止,例如直接调用 process.exit() 或抛出未捕获的异常,'beforeExit' 事件不会被触发。

除非本意就是需要添加额外的工作(比如通过监听器进行异步调用)到事件循环数组,否则不应该用 'beforeExit' 事件替代 'exit' 事件。

'disconnect' 事件#

如果 Node.js 进程是由 IPC 通道的方式创建的(详见子进程集群文档),当 IPC 通道关闭时,会触发'disconnect'事件。

'exit' 事件#

两种情况下 'exit' 事件会被触发:

  • 显式调用 process.exit() 方法,使得 Node.js 进程即将结束;
  • Node.js 事件循环数组中不再有额外的工作,使得 Node.js 进程即将结束。

在上述两种情况下,没有任何方法可以阻止事件循环的结束,一旦所有与 'exit' 事件绑定的监听器执行完成,Node.js 的进程会终止。

'exit' 事件监听器的回调函数,只有一个入参,这个参数的值可以是 process.exitCode 的属性值,或者是调用 process.exit() 方法时传入的 exitCode 值。

例如:

process.on('exit', (code) => {  console.log(`即将退出,退出码:${code}`);});

'exit' 事件监听器的回调函数,只允许包含同步操作。所有监听器的回调函数被调用后,任何在事件循环数组中排队的工作都会被强制丢弃,然后 Nodje.js 进程会立即结束。例如在下例中,定时器中的操作永远不会被执行(因为不是同步操作)。

process.on('exit', (code) => {  setTimeout(() => {    console.log('该函数不会被执行');  }, 0);});

'message' 事件#

如果 Node.js 进程是由 IPC 通道的方式创建的(详见子进程集群文档),当子进程收到父进程发送的消息时(消息通过 childprocess.send() 发送),会触发 'message' 事件。

通过下列参数触发回调: