Node中的事件循环浏览器
事件循环是Node的核心,正是由于有了事件循环JS才可以在服务端占有一席之地。JS是一种单线程语言,可是它的执行环境是多线程的在加上JS的事件驱动这一特色,使使JS在执行的过程当中没执行到一个异步操做就交由后台处理而后继续向下执行,在赶上一个异步操做又交由后台处理,JS的执行线程不会发生阻塞,一旦JS代码执行完毕就会去后台查看有没有知足条件的异步操做一旦有知足条件的就执行事先定义好的处理函数。多线程
在Node中经过EventEmitter(事件发生器)来实现这种功能,EventEmitter和咱们在浏览器中使用自定义事件的方式是差很少的,其使用方式为:异步
var events = require("events").EventEmitter; var event = new events; event.on("zt",function(){console.log(111)}); event.emit("zt");
经过require("events").EventEmitter来获取事件发生器函数,咱们在实例化一个对象,这样这个对象就得到了事件发生器原型上的方法,分别为on和emit,咱们能够经过on()函数来注册一个事件,它能够接收两个参数第一个参数为eventName,第二个参数为对应的事件处理函数。在绑定事件以后能够经过emit来主动触发事件。函数
事件发生器能够为一个事件绑定多个事件处理函数,而且它的执行顺序是能够保证的,在前面的优先执行:ui
var events = require("events").EventEmitter; var event = new events; event.on("zt",function(){console.log("我是第一个处理函数")}); event.on("zt",function(){console.log("我是第二个处理函数")}); event.emit("zt");
事件处理函数一样能够接收参数,在主动触发时传入参数便可:spa
var events = require("events").EventEmitter; var event = new events; event.on("zt",function(a,b){console.log("我是第一个处理函数"+"参数1:"+a+"参数2:"+b)}); event.on("zt",function(a){console.log("我是第二个处理函数"+"参数1:"+a)}); event.emit("zt","AA","BB");
在使用emit()时第一个参数表示要触发的事件,后面的参数就表示事件处理函数的参数。线程
事件发生器能够实现异步,但其自己是同步的:code
var events = require("events").EventEmitter; var event = new events; event.on("zt",function(){console.log("我是第一个处理函数")}); event.on("zt",function(){console.log("我是第二个处理函数")}); setTimeout(function(){ event.emit("zt"); },1000); event.on("zt",function(){console.log("我是第三个处理函数")});
事件发生器的on方法等价于一个存储方法,它会把事件名和事件处理函数存储起来,并不会执行,一旦使用emit触发事件以后执行已经存储的处理函数,在emit触发事件后已经添加的事件处理函数就会当即执行,这个操做并非异步的。对象
var events = require("events").EventEmitter; var event = new events; event.on("zt",function(){console.log("我是第一个处理函数")}); event.on("zt",function(){console.log("我是第二个处理函数")}); event.emit("zt"); event.on("zt",function(){console.log("我是第三个处理函数")});
将上面的定时器去掉,若是emit是一个异步操做那么第三个处理函数就会执行,可是事实上程序只是执行了前两个事件处理函数。blog