重新学习Node,整理以前的日志。
Nodejs的大部分核心API都是基于异步事件驱动设计的,所有可以分发事件的对象都是EventEmitter类的实例。
如何使用 实例化events.EventEmitter这个类,然后就可以使用手册上的一些方法了。
1 2 var event = require ("events" )var emitter = new event.EventEmitter ();
实例化之后就可以添加EventEmitter的一些方法了。
1 2 emitter.on ("事件名称" ,监听函数); emitter.emit ("事件名称" ,[参数1 ], [参数2 ]...)
on和emit是最基本的方法,on用来建立普通的事件监听(也就是监听器),当事件触发则执行监听函数;
emit用来触发某个事件,然后将参数按顺序传入监听函数。
下面是一个基本的例子,当emiiter的event1事件被触发后就执行了func1,如果定义了多个evnet1,则event1也会在触发后执行多次。
1 2 3 4 emitter.on ("event1" , function func1 (msg1, msg2 ){ console .log (msg1+"+" +msg2) }); emitter.emit ("event1" ,"this is event1" , "this is event2" );
其他监听方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 emitter.addListener (event, listener) emitter.once (event, listener) emitter.removeListener (event, listener) emitter.removeAllListeners (event) emitter.setMaxListeners (n) emitter.listeners (event)
看一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 var event = require ("events" ), emitter = new event.EventEmitter (); var func1 = function (msg1, msg2 ){ console .log (msg1+msg2)}; var func2 = function ( ){console .log ("this is event2" )};var func3 = function ( ){console .log ("this is event3" )};emitter.on ("event1" ,func1); emitter.addListener ("event1" , func2); emitter.on ("event1" ,func3); console .log (emitter.listeners ("event1" ));emitter.emit ("event1" ,"this is " , "event1" ); emitter.removeListener ("event1" , func1); console .log (emitter.listeners ("event1" ));emitter.emit ("event1" ,"this is event1" , "this is event2" ); emitter.removeAllListeners ("event1" ); console .log (emitter.listeners ("event1" ));emitter.emit ("event1" ,"this is event1" , "this is event2" );
应用实例 比如有一个秒杀活动,只有第一个点击按钮的人才有机会获取奖品,网站会记录本次活动有多少人点击这个按钮,同时又要根据用户ID记录此用户点过多少次这个按钮。
不使用事件监听代码可能这么写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var prize = false ; var isactive = true ; if (有人点击抽奖按钮){ if (!isactive ) return false ; if (!prize){ getprize (此人id, 按钮id); prize = true ; } addbutton (此人id, 按钮id); addclick (此人id, 按钮id); } setTimeout (function ( ){ isactive = false ; }, 1000 *60 *60 *24 );
上面这段代码对我自己也是有启发的:
奖品是否被领取、活动是否开启在这个代码的开始部分都用了布尔值作为标识符,这样在后面根据条件、状态的变化改变对应的标识符即可,然后将这些标识符作为if的判断条件。
如果用事件监听改写上面代码,看上去更清晰,而且可能效率更高一些。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var events = require ("events" );var btclick = new events.EventEmitter ();btclick.once ('bt0click' ,getprize) btclick.on ('bt0click' , addbutton); btclick.on ('bt0click' , addclick); if (有人点击抽奖按钮){ btclick.emit ('bt0click' , 此人ID , 按钮ID ); } setTimeout (function ( ){ btclick.removeAllListeners ('bt0click' ); }, 1000 *60 *60 *24 );
参考