ES6异步编程——任务队列和事件循环

192 阅读2分钟

任务队列:

任务:指的是js代码中的运行的代码,例如:fn()、脚本、计时器的运行、promise

分类:同步的任务和异步的任务

同步的任务:一行一行的代码执行,就是同步任务

异步的任务:就是代码不会堵塞(在另一个线程(js底层可以使用其它线程,因为底层是C语言、c++创建的)执行这个代码本身的表面一层,执行完了,再返回js线程(js是单线程的)执行里面的回调函数),例如:setTimeout()、p1.then()

宏任务:计时器、全局脚本

微任务:then是微任务

难点:

异步任务的队列优先级:异步宏任务先执行,然后再执行异步微任务

script标签也是一个宏任务,每一次的宏任务都要等上一层的宏任务执行完毕才执行。如果异步微任务是在上一次的宏任务中的,那么它的优先级大于这一层的宏任务。

脚本运行:

1.先执行同步任务

2.添加新的宏任务到队列中,添加新的异步微任务

3.执行异步微任务

事件循环:

事件循环:就是利用了上面任务队列的优先级

1.先执行第一轮宏任务(也就是脚本)中的代码:执行的顺序是:

 同步任务--微任务--下一轮宏任务中的代码

2.下一轮排队的宏任务中:

执行同步--执行微任务--遇到宏任务继续排队--执行下轮排队的宏任务

3.下一轮排队的宏任务中:

执行同步--执行微任务--遇到宏任务继续排队--执行下轮排队的宏任务

4.下一轮排队的宏任务中:

执行同步--执行微任务--遇到宏任务继续排队--执行下轮排队的宏任务

后面就开始循环起来了,也就是事件循环