浏览器中的Eventloop

1. 学习目标

  • 什么是Eventloop
  • 浏览器端的Eventloop起到了什么作用
  • Node.js服务端的Eventloop的作用又表现在哪里

2. 浏览器的Eventloop

Eventloop理解成我们编写的Javascript和浏览器或者Node之间的一个桥梁。

浏览器的事件循环是我们编写的JavaScript代码和浏览器API调用(settimeout/AJAX/事件监听等)的一个桥梁,桥梁之间他们通过回调函数进行沟通。

JS在单线程上执行所有操作,虽然是单线程,但是能够有效地解决问题,并且能够带来一种多线程的错觉。这依赖于浏览器的Eventloop,能够大大提升代码的执行效率。

主要有以下三个部分组成

  • 调用栈(call stack)

调用栈负责跟踪所有要执行的代码。

  •  浏览器API库

每当调用事件队列中的异步函数是都会将其发送到浏览器的API,setTimeout方法就是一个比较典型的例子,它将操作发送到事件队列,这样就有了一个循环系统,用于在JS中运行异步操作。

  • 事件队列

事件队列负责将新的function发送到队列中进行处理.

3. 举例说明

Eventloop通过两个队列来实现Event Queue放进来的异步任务,两个队列分别是宏任务队列和微任务队列:

以setTimeout为代表的任务被称为宏任务,放到宏任务队列中:

macrotasks(宏任务):
script(整体代码),setTimeout, setInterval, setImmediate, I/O, UI rending, event listener

 以Promise为代表的任务被称为微任务,放到微任务队列中:

microtasks(微任务):
process, nextTick, Promises, Object.observe, MutationObserver

 执行方式:

一次Eventloop循环会处理一个宏任务和所有这次循环中的微任务。

JavaScript引擎首先会从宏任务队列中取出第一个宏任务,执行完毕后,再将微任务中的所有任务取出,按照顺序分别全部执行,如果在这一步过程中,产生了新的微任务也是需要进行执行的,然后再从宏任务队列中取出下一个,执行完毕后,再次将微任务队列中所有任务执行完毕,循环往复,直到两个队列中的所有任务都取完。

4. node.js中的Eventloop

  1. node的事件循环是一个我们编写的Javascript代码和系统调用(file system,networke等)之间的一个桥梁,桥梁之间通过回调函数进行沟通。

主要有以下六个阶段:

  1. timers:执行setTimeout()和setInterval()触发的回调
  2. I/O callbacks:系统级别的回调函数
  3. idel,prepare:空闲准备阶段
  4. poll:检索新的I / O事件;执行I / O相关的回调(会执行几乎所有的回调,除了 close callbacks 以及 timers 调度的回调和 setImmediate() 调度的回调,在恰当的时机将会阻塞在此阶段)
  5. check:执行setImmediate()
  6. close callbacks:关闭回调函数,比如socket等

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值