Node.js 全局对象与事件

Node.js 全局对象

Node.js 中,在一个模块中定义的变量、函数只在该模块中可用,但可用通过 exports 将其传递到模块外部。同时,存在一个全局作用域 global ,即可用定义一些不需要通过任何模块加载即可使用的变量、函数或者类。

global.js

global.username = 'Jax';
exports.sayHello = (data) => console.log(data)

index.js

let page = require('./global.js');
console.log(global.username);

全局变量

global 所有拥有的所有属性称为全局变量,可用在任何地方直接访问而不需要在应用中包含它。主要的全局变量有:

  • __filename 表示当前正在执行的脚本的文件名,它将输出文件所在位置的绝对路径。
  • __dirname 表示当前执行脚本所在的目录,它将输出文件所在位置的绝对路径。
  • console 用于提供控制台标准输出
  • process 用于描述当前 Node.js 进程的状态
    • stdout 输出流
    • stdn 输入流
    • platform 平台信息
    • arch CPU 架构
    • memoryUsage() 内存状况
    • exit() 结束进程

全局函数

  • setTimeout
  • clearTimeout
  • setInterval
  • clearInterval

Node.js 事件监听与触发

Node.js 本身框架就是事件式,events 是它提供了唯一的接口。events 只提供一个对象,EventEmitter,它的核心就是对事件发射和监听的封装。EventEmitter 支持为相同的事件定义多个监听器。当通过 emit 函数触发事件时,改事件的监听器会依次被调用。

let events = require('events');
let emitter = new events.EventEmitter();

emitter.addListener("say", ()=>{
  console.log('hello')
})

emitter.addListener("say", ()=>{
  console.log('world')
})

emitter.emit('say');

EventEmitter 会按照监听器注册顺序同步调用所有监听器,如果需要并发执行,可以使用 setImmediate 方法切换到异步操作模式。

let events = require('events');
let emitter = new events.EventEmitter();

emitter.addListener("say", ()=>{
  setImmediate(()=>{
    console.log('hello')
  })
})

emitter.addListener("say", ()=>{
  setImmediate(()=>{
    console.log('world')
  })
})

emitter.emit('say');

EventEmitter 的只处理一次事件 API ,once 监听器只会做一次相应。

let events = require('events');
let emitter = new events.EventEmitter();

emitter.once("sayHello", ()=>{
  console.log('sayHello')
})

emitter.emit('sayHello');
emitter.emit('sayHello');

EventEmitter 还有一个监听的 API 为 on ,和 addListener 用法相同。同时,emit 还可以传递参数。

```js
let events = require('events');
let emitter = new events.EventEmitter();
emitter.on("say", (data)=>{
  console.log(data)
})

emitter.emit('say','hello world');

EventEmitter 的其他 API

  • emitter.removeListener('eventName'); // 解绑只有一个 eventName 监听器的事件
  • emitter.removeAllListeners('eventName'); // 解绑所有 eventName 监听器的事件

更多 API 可以查阅 Node.js API events http://nodejs.cn/api/events.html

另外,EventEmitter 还定义了一个特殊的事件 error ,当该事件被发射时,如果没有绑定监听器,Node.js 会把它当作异常,推出程序并打印调用栈。