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 会把它当作异常,推出程序并打印调用栈。