事件循环
同步任务和异步任务
同步任务:就是那些没有被引擎挂起,在主线程上排队的任务。前一个任务执行完,下一个任务才开始。
异步任务:被引擎放在一边,不在主线程上排队,而在任务队列的任务。只有引擎认为某个异步任务可以执行了,该任务才会进入主线程执行。
事件循坏:引擎不断检查同步任务,只要同步任务都执行完了,引擎就会检查那些挂起得异步任务,是否可以进入主线程。这种循环机制,称为事件循环。
宏任务和微任务
宏任务:setTimeout、setInterval、整体script代码 微任务:promise、process.nextTick()
整体代码进入宏任务后,开始第一次循坏。首先执行完全部微任务后。接着再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。
事件循环
首先,整体的script(作为第一个宏任务)开始执行的时候,会把所有代码分为
同步任务
、异步任务
两部分同步任务会直接进入主线程依次执行
异步任务会再分为宏任务和微任务
宏任务进入到Event Table中,并在里面注册回调函数,每当指定的事件完成时,Event Table会将这个函数移到Event Queue中
微任务也会进入到另一个Event Table中,并在里面注册回调函数,每当指定的事件完成时,Event Table会将这个函数移到Event Queue中
当主线程内的任务执行完毕,主线程为空时,会检查微任务的Event Queue,如果有任务,就全部执行,如果没有就执行下一个宏任务
上述过程会不断重复,这就是Event Loop,比较完整的事件循环
异步操作
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