事件驱动原理

事件驱动原理

简单地说 ,就是由于js代码只在一个线程上运行,他容易被阻塞。例如:复杂的算法运算,js进行复杂的dom操作等等。我们试想下如果一打开页面,就有大量IO请求,都是同步执行的话,页面会有多卡,所以事件驱动最终实际上是解决单线程通道阻塞问题,通过事件队列的方式给主通道让路

浏览器有两个线程,一个是js线程,一个是ui线程 ,两线程是互斥的,一旦一个线程阻塞,另一线程无法响应用户的操作

用户在界面上进行的操作称之为事件(Event)。由用户操作引发的一连串程序的动作,称之为事件驱动(Event-Driver).对事件进行处理程序或函数,我们称之为事件处理程序(Event Handler)
在这里插入图片描述

js虽然是单线程的,但是浏览器是多线程的,GUI渲染线程,js引擎线程,事件触发线程,定时器触发线程,异步请求http线程
当你打开chrome浏览器中的一个tab的时候,有多少线程在为你服务:
1.GUI渲染线程
2.js引擎线程
3.事件触发线程
4.定时器触发线程
5.异步请求http线程

宏任务和微任务

宏任务包括:setTimeout, setInterval, setImmediate, I/O, UI rendering

微任务: promise.then, process.nextTick, quequeMicrotask

为什么要设计宏任务和微任务,比如从客户端发起ajax请求向服务端获取数据,在此过程中,js引擎执行完了主线程上所有代码,在这时,他就要等待异步线程返回结果,为了提高执行效率,充分利用js引擎的资源,会让他去执行微任务,等所有的微任务执行完以后,再回到异步回调返回的结果里面执行相应的逻辑
微任务的性能要高于宏任务,因为微任务是v8引擎自带的api接口,而宏任务是v8引擎对底层定义宏任务api接口的封装
执行优先级:主线程上的任务> 微任务> 宏任务

事件轮询

在这里插入图片描述
js内存中有堆栈,堆中存对象,事件会入栈,如果栈中有异步任务,会将异步任务提交到异步模块进行处理,例如ajax请求,setTimeout,Dom等模块,提交完之后,会回到主线程上,继续执行他未完成的代码和任务,当完成代码和任务,会进入一个事件循环,在循环过程中,会定期去检查任务队列中有没有已完成的任务,任务队列中的任务大多都是由异步模块推送过来的已完成的结果

练习

看完这上面的,可以自己分析一下这些代码的执行顺序

console.log(1)   

setTimeout(()=> {
  console.log(2)
  new Promise(() => {
    console.log(11)
  })
})

queueMicrotask(() => {
  console.log(7)
})

let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log(10)
  })
  resolve()
  console.log(4)
})

fn()
console.log(3)

promise.then(() => {
  console.log(12)
})

function fn() {
  console.log(6)
}

答案是 1 4 6 3 7 12 2 11 10,你分析对了吗?

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 是一个基于事件驱动JavaScript 运行环境。它的事件驱动机制基于观察者模式和回调函数。 事件驱动原理是,Node.js 在执行过程中会不断地监听各种事件,当某个事件发生时,Node.js 会触发相应的回调函数来处理事件。这种机制使得 Node.js 能够高效地处理大量并发请求。 具体来说,Node.js事件驱动原理包括以下几个关键组件: 1. 事件循环(Event Loop):Node.js 在单线程中运行,它的事件循环负责监听和分发事件。事件循环会不断地从事件队列中取出事件,并将事件分发给对应的回调函数进行处理。 2. 事件队列(Event Queue):事件队列是用来存储待处理的事件的队列。当某个事件触发时,相关的回调函数会被添加到事件队列中等待执行。 3. 观察者(Observer):观察者是用来监听特定类型事件的对象。在 Node.js 中,观察者可以是内部的模块、外部的库或用户自定义的对象。当某个观察者监听到特定类型的事件时,它会将对应的回调函数添加到事件队列中。 4. 回调函数(Callback):回调函数是在特定事件发生时被执行的函数。它是异步编程的核心机制,在 Node.js 中广泛使用。当某个事件触发时,事件循环会从事件队列中取出对应的回调函数,并执行它。 总的来说,Node.js事件驱动机制基于事件循环、事件队列、观察者和回调函数的组合。通过这种机制,Node.js 能够高效地处理并发请求,提供高性能的网络服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值