NodeJS 事件循环
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式(发布-订阅)实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
var events = require('events'); var eventEmitter = new events.EventEmitter(); //创建处理程序 var onFire = function() { console.log('点火'); //触发放油 eventEmitter.emit('pour_oil'); }; eventEmitter.on('fire', onFire); var oil = function() { console.log('往锅里倒油'); } eventEmitter.on('pour_oil', oil); eventEmitter.emit('fire'); console.log('程序结束');
EventEmitter 提供了多个属性,如 on 和 emit。on 函数用于绑定事件函数,emit 属性用于触发一个事件。接下来我们来具体看下 EventEmitter 的属性介绍。
var events = require('events'); var eventEmitter = new events.EventEmitter(); //创建处理程序 var onFire = function() { console.log('点火'); //触发放油 eventEmitter.emit('pour_oil'); }; eventEmitter.on('fire', onFire); var oil = function() { console.log('往锅里倒油'); } eventEmitter.on('pour_oil', oil); var listen1; //添加监听器 eventEmitter.addListener('fire', listen1 = function() { console.log('fire1'); }); eventEmitter.addListener('fire', function() { console.log('fire2'); }); //统计fire事件上有多少个监听器 var count = require('events').EventEmitter.listenerCount(eventEmitter, 'fire'); console.log("fire上有 " + count + " 个事件监听器。"); //移除监听器 eventEmitter.removeListener('fire', listen1); console.log('listen1 已经被移除'); //统计fire事件上有多少个监听器 var count = require('events').EventEmitter.listenerCount(eventEmitter, 'fire'); console.log("fire上有 " + count + " 个事件监听器。"); console.log('程序结束');