在了解EventLoop之前,我们需要知道什么
- javaScript是单线程。
- javaScript任务可以分为同步任务和异步任务
作为一个单线程语言,执行同步任务,自然是没有问题,那么,他又是如何执行异步任务的呢?这里就用到了我们要说的EventLoop。
什么是EventLoop
EventLoop又称事件循环机制,是浏览器或者Node为了防止JavaScript在单线程在单线程运行时发生阻塞的一种事件机制。
javaScript任务队列
想要了解EventLoop究竟是如何工作的,我们首先还要了解javaScript的事件队列。
我们可以理解为我们的代码是一个任务队列,他由同步任务和异步任务构成,
因为javaScript单线程的特点,所以所有的任务只能一个一个执行,前一个任务结束,后一个任务开始,这就是我们前面说到的同步任务,当然还有另外一种任务,比如后端的数据请求,如果数据量大,后端返回运行的逻辑复杂,就会导致数据返回的很慢,这样一来,如果后面的任务一直等着,就会造成任务的阻塞,所以我们需要将返回慢的暂时挂起,然后先执行后面的事件,这也就是我们上面说的异步任务。
微任务与宏任务
这是EventLoop的重点,宏任务与微任务:
宏任务(MacroTask,也成Task):script(整体代码)、setTimeout、setInterval、I\O、UI交互事件、postMessageChannel、setImmediate
微任务(MircoTask):Promise.then、Object.observe、MutaionObserver、process.nextTick
他们的简单执行过程:
先执行一个宏任务,然后如果遇到微任务就把微任务放到微任务列表中,然后等宏任务执行完成,执行所有微任务,当微任务全部执行完成之后可以视为当前宏任务已经执行完成,然后进行浏览器渲染,渲染完成后开启下一个宏任务。