nodejs入门总结二:事件驱动

JavaScript015

nodejs入门总结二:事件驱动,第1张

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

events事件模块:

只有一个模块,EventEmitter核心就是事件触发emite,和事件监听on

应用

(1)const event=require("events")模块

(2)new一个新的对象new evnet.EventEmitter()

(3)on("eventName",function(error,data){})创建监听器,一个事件可以创建多个监听

(4)emit("eventName")触发事件

(5)addListener("eventName",function(error,data){})也可以监听事件

(6)listenerCount("eventName")获取监听器个数,

getMaxListeners()//获取监听器数量;

setMaxListeners(n)//设置监听器数量;

eventNames() 获取当前触发器实例注册的所有事件名

listeners(事件名称)获取指定事件下的所有监听器

rawListeners(事件名称) 获取指定事件下的所有监听器

(7)移除监听事件的监听器;removeListener("eventName",fun),removeAllListener()off(事件名称,监听器名称)

(8)once():只触发一次,被移除;

(9)prependListener(事件名称,监听器):优先触发,事件监听器;

(10)prependOnceListener(事件名称,监听器) 触发一次 触发后移除

(11)EventEmitter.defaultMaxListeners = 8 每一个触发器实例 同一个事件最多绑定10个监听器 超出报警告

触发器实例上的内部事件

(1)订阅就会触发 newListener

myEmitter.on('newListener',(eventName,listener)=>{

console.log( 新增事件${eventName} ,listener)

})

(2)移除监听器会触发 removeListener

myEmitter.on('removeListener',(eventName,listener)=>{

console.log( 移除事件${eventName} ,listener)

})

事件触发,放在调用堆栈中;定时器结束时,函数会被放入“消息队列”中

事件循环会赋予调用堆栈优先级,它首先处理在调用堆栈中找到的所有东西,一旦其中没有任何东西,便开始处理消息队列中的东西。

setTimeout、fetch、或其他的函数是使用的是消息队列:回调函数放在调用堆栈的末尾;

promise,async/await函数使用的是作业队列:前函数结束之前 resolve 的 Promise 会在当前函数之后被立即执行。

process.nextTick(fun):事件循环进行一次完整行程时我们成为一个滴答,传入的函数则指示引擎在当前操作结束(在下一个事件循环滴答开始之前)时调用此函数:

回掉函数的第一个参数是err,如果正确返回null

12.2 事件驱动与事件处理

事件驱动是JavaScript响应用户操作的一种处理方式,而事件处理是JavaScript响应用户操作所调用的程序代码。

12.2.1 事件驱动

在多年以前,计算机程序通常是以批处理的模式运行。所谓批处理,就是开发者事先写好一些代码,再将这些代码一次运行。这种处理方式有点类似于通过HTML代码直接编写的网页。浏览器只是将HTML代码逐行解析,并显示在浏览器窗口。

后来,在批处理模式中,开发者可以加入一些特定的代码,在程序批处理期间,可以停下来等待用户输入一些信息,并根据用户输入的信息来判断和执行某个程序分支,这就使程序有了初步的交互性。

随着鼠标、触摸屏等设备的出现,批处理时代就逐渐远去,取而代之的是事件驱动的时代。当然,批处理也还能使用,只是使用的范围和频率比事件驱动要少得多。以鼠标为例,在事件驱动中,用户可以使用鼠标单击等方式进行操作,程序则根据鼠标指针的位置以及单击的方式进行响应。JavaScript使用的就是这种事件驱动的程序设计方式。

在JavaScript中,事件(Even)包括以下两个方面:

● 用户在浏览器中产生的操作是事件,如单击鼠标、按下键盘上的键等。

● 文档本身产生的事件,如文档加载完毕、卸载文档等,都是事件。

12.2.2 事件处理

在JavaScript中,浏览器会使用事件来通知JavaScript程序响应用户的操作。事件的类型有很多种,如鼠标事件、键盘事件、加载与卸载事件、得到焦点与失去焦点事件等。在事件产生的时候,浏览器会调用一个JavaScript程序来响应这个事件,这就是JavaScript的事件处理方式。要想让浏览器可以调用合适的JavaScript程序,就必须要做到以下 3点:

(1)设置HTML文档中响应事件的元素。在一个HTML文档中,并非所有元素都会去响应事件。就鼠标单击事件而言,一般在HTML文档的正文不会响应该事件,但在按钮中一般都会响应该事件。

(2)设置元素响应事件的类型。在确定了哪些元素响应事件之后,要设置该元素响应事件的类型。例如,一个按钮通常会响应鼠标单击事件(click事件),而一个下拉列表框通常会响应选项变化事件(change事件)。在同一个元素中,也可以响应多个事件。例如,一个超链接,在鼠标移动到该超链接上时,可以响应鼠标移动到对象上事件(mouseover事件),当鼠标从超链接上移开时,又可以响应鼠标移开事件(mouseout事件)。

(3)设置响应事件的程序。为了让浏览器可以响应事件,必须要设置响应事件的程序。例如一个按钮被单击时,浏览器会响应这个click事件,此时浏览器就会在JavaScript中寻找一个合适的程序,并运行该程序。这个程序可以是用户自定义的函数,也可以是一段JavaScript代码,还可以是JavaScript内置对象的方法等。

看看这个 http://ajava.org/readbook/js/jsdaq/4709.html更详细