【深度剖析】曾经让人无法理解的事件循环

事件循环

在浏览器端,JS 是单线程的,也就是说,在同一个时刻最多只有一个代码片段在执行,可是浏览器又可以很好的处理异步请求,到底是为什么呢?

先来说明执行中的两个线程:

  • 主线程:JS 引擎执行的线程,只有一个,负责页面渲染、函数处理。
  • 工作线程:也称为幕后线程,这个线程可能存在于浏览器或 JS 引擎内部,与主线程是分开的,处理文件读取、网络请求等异步事件。

在主线程中有一个执行栈,所有的 JS 代码都会在执行栈里运行。在执行代码的过程中,如果遇到一些异步代码,比如,setTimeoutajax 等等,那么浏览器就会将这些代码放到工作线程中执行,在前端由浏览器底层执行,这个线程的执行不会阻塞主线程的执行,主线程继续执行栈中的剩余代码。

当工作线程里的代码执行完成后,该线程就会将它的回调函数放到任务队列中(又称为事件队列,消息队列)等待执行。而当主线程执行完栈中的所有代码后,它就会检查任务队列是否有任务要执行,如果有任务要执行的话,那么就将该任务放到执行栈中执行。如果当前任务队列为空的话,它就会一直循环等待任务的到来,因此,这也被称为事件循环。

任务队列

从上面可知,工作线程会将异步的回调函数放到任务队列中,然后让主线程来执行,那么问题来了,如果任务队列中有多个任务,那么要执行哪个呢?

JS 中,有两个任务队列,一个叫做 Macrotask Queue(Task Queue) 大任务,另一个是 Microtask Queue 小任务。

Macrotask 常见的任务:

  • setTimeout
  • setInterval
  • setImmediate
  • I/O
  • 用户交互操作,UI 渲染

Microtask 常见的任务:

  • Promise
  • process.nextTick
  • Object.observe

如果两种任务同时出现,事件循环执行是这样的:

  1. 检查大任务队列是否为空,若不为空,则进行下一步,若为空,跳到3
  2. 从大任务队列中取队首(在队列时间最长)的任务进去执行栈中执行(仅仅一个),执行完进入下一步
  3. 检查小任务队列是否为空,若不为空,则进行下一步,否则跳到1
  4. 从小任务队列中取出队首(在队列时间最长)的任务进去事件队列

简而言之,一次事件循环只执行处于 Macrotask 队首的任务,执行完成后,立即执行 Microtask 队列中的所有任务。

基于这个结论来看一个例子:

console.log(1)
setTimeout(function
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Byteart Retail是一个虚拟的商业公司,我们将运用深度剖析来分析其领域事件(domain events)。 领域事件是指在业务领域中发生的一系列重要事件,这些事件会影响到系统的状态和数据的变化。在Byteart Retail的案例中,领域事件包括但不限于以下几个方面: 1. 商品库存变更事件:当商品的库存发生变化时,例如商品售罄、补货等,会触发商品库存变更事件。这个事件会影响到系统中商品的可售性和可订购性。 2. 下单事件:当顾客下单购买商品时,会触发下单事件。下单事件会更新系统中的订单信息,并触发相应的库存扣减操作。 3. 付款事件:当顾客完成支付时,会触发付款事件。这个事件会更新系统中订单的支付状态,并触发相应的财务流程。 4. 发货事件:当商家准备发货时,会触发发货事件。发货事件会更新系统中订单的发货状态,并触发相应的物流流程。 5. 退货事件:当顾客申请退货时,会触发退货事件。退货事件会更新系统中订单的退货状态,并触发相应的退款和售后流程。 这些领域事件在Byteart Retail的系统中起着重要的作用,它们之间的触发和处理是系统运行的核心。通过深度剖析这些领域事件,我们可以更好地理解系统的业务逻辑和数据流动,从而优化系统的设计和开发。 为了更好地处理这些领域事件,我们可以使用事件驱动架构。通过发布与订阅的模式,将系统中不同的模块解耦,实现各个模块之间的松耦合。每当一个领域事件发生时,相关的订阅者会接收到事件通知并进行相应的处理。这种架构可以提高系统的可扩展性和可维护性,同时也有助于实现系统的并发性和异步处理能力。 总之,通过深度剖析Byteart Retail案例中的领域事件,我们可以更好地理解系统的业务逻辑和数据流动,从而为系统的设计和开发提供指导和优化方向。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值