codecamp

Node.js events事件模块

Node.js自带了对核心events模块中的events的内置支持。

使用require("events")加载模块。

events模块有一个简单的类“EventEmitter”。

EventEmitter类

EventEmitter是一个类,旨在使其易于发出events和订阅引发的events。

以下代码提供了一个小代码示例,其中我们订阅了一个事件,然后引发它。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 

// Subscribe 
emitter.on("foo", function (arg1, arg2) {
   console.log("Foo raised, Args:", arg1, arg2); 
}); 
// Emit 
emitter.emit("foo", { a: 123 }, { b: 456 }); 

我们可以用一个简单的 new EventEmitter 调用创建一个新的实例。

要订阅events,请使用事件名称中的 on 函数传递,后面跟随事件处理函数。

最后,我们使用 emit 函数引发一个事件,传递跟随有任意数量我们想传递给监听器的参数的事件名称。

多个订阅者

以下代码显示了如何为一个事件拥有多个订阅者。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
//from   www.w3cschool.cn
emitter.on("foo", function () {
    console.log("subscriber 1"); 
}); 
emitter.on("foo", function () {
    console.log("subscriber 2"); 
}); 

// Emit 
emitter.emit("foo"); 

上面的代码生成以下结果。

多个subscribers

注意

监听器按它们为事件注册的顺序调用。

为事件传入的任何参数在各个订阅者之间共享。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
//  www.w3cschool.cn
emitter.on("foo", function (ev) {
    console.log("subscriber 1:", ev);
    ev.handled = true; 
}); 

emitter.on("foo", function (ev) { 
   if (ev.handled) { 
      console.log("event already handled"); 
   } 
}); 

// Emit 
emitter.emit("foo", {handled: false }); 

在此示例中,第一个监听器修改了传递的事件参数,第二个监听器获取了修改的对象。

取消订阅

EventEmitter有一个removeListener函数,它接收一个跟随函数对象的事件名称从侦听队列中进行删除。

我们必须有一个对你想从监听队列中删除的函数的引用。

以下代码显示如何取消订阅监听器。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
//from   www.w3cschool.cn
var fooHandler = function () { 
    console.log("handler called");
    // Unsubscribe 
    emitter.removeListener("foo",fooHandler); 
}; 

emitter.on("foo", fooHandler); 
// Emit twice 
emitter.emit("foo"); 
emitter.emit("foo"); 

在此示例中,我们在引发一次后取消订阅事件。结果,第二事件不被注意。

EventEmitter提供了仅一次调用已注册监听器“once”的函数。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
/*www.w3cschool.cn*/
emitter.once("foo", function () {
     console.log("foo has been raised"); 
}); 

// Emit twice 
emitter.emit("foo"); 
emitter.emit("foo"); 

foo的事件监听器将只被调用一次。

Node.js colors包
Node.js 全局事件
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }