阅读 146

事件循环

同步任务和异步任务

同步任务:就是那些没有被引擎挂起,在主线程上排队的任务。前一个任务执行完,下一个任务才开始。

异步任务:被引擎放在一边,不在主线程上排队,而在任务队列的任务。只有引擎认为某个异步任务可以执行了,该任务才会进入主线程执行。

事件循坏:引擎不断检查同步任务,只要同步任务都执行完了,引擎就会检查那些挂起得异步任务,是否可以进入主线程。这种循环机制,称为事件循环。

宏任务和微任务

宏任务:setTimeout、setInterval、整体script代码 微任务:promise、process.nextTick()

整体代码进入宏任务后,开始第一次循坏。首先执行完全部微任务后。接着再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。

事件循环

  • 首先,整体的script(作为第一个宏任务)开始执行的时候,会把所有代码分为同步任务异步任务两部分

  • 同步任务会直接进入主线程依次执行

  • 异步任务会再分为宏任务和微任务

  • 宏任务进入到Event Table中,并在里面注册回调函数,每当指定的事件完成时,Event Table会将这个函数移到Event Queue中

  • 微任务也会进入到另一个Event Table中,并在里面注册回调函数,每当指定的事件完成时,Event Table会将这个函数移到Event Queue中

  • 当主线程内的任务执行完毕,主线程为空时,会检查微任务的Event Queue,如果有任务,就全部执行,如果没有就执行下一个宏任务

  • 上述过程会不断重复,这就是Event Loop,比较完整的事件循环

20210920190325.png

异步操作

1、回调函数

eg: f1是异步,f2同步,直接执行

function f1(callback) {
callback()
}
f2() { 
}
f1(f2);复制代码

2、事件监听

另一种思路是采取事件驱动模式,异步任务的执行不取决于代码顺序,取决于事件是否执行。

f1绑定done事件,只要触发
f1.on('done',f2);

function f1() {
setTimeout( function() {
f1.trigger('done')
},1000)复制代码

优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可去耦合,有利于实现模块化。 缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。阅读代码的时候,很难看出主流程。

3、发布/订阅模式

事件可以理解为信号。如果存在一个信号中心,某个事件完成就向信号中心发布一个信号,其他任务可以向信号中心订阅这个信号,从而知道自己什么时候开始执行。

异步任务的控制流程

串行,并行,串并行


作者:养只大狗
链接:https://juejin.cn/post/7020958286652375071


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐