异步中的宏任务和微任务

宏任务

script(整体代码)

setTimeout

setInterval

I/O

UI交互事件

postMessage

MessageChannel

setImmediate(Node.js 环境)

微任务

Promise.then

Object.observe

MutationObserver

扫描二维码关注公众号,回复: 15029669 查看本文章

process.nextTick(Node.js 环境)

----------------------------------------------------------------来猜猜代码执行顺序呀

 --------输出结果

我画了一个简陋的图

我来描述下,执行顺序,同步代码肯定先执行的,是直接进入执行栈的,所以第一个输出”我是同步代码“,在每个任务单元下,包括同步、异步,执行完成后,都会检测这个作用域下目前的单元任务中也没有没有执行的微任务,有就会执行,没有就会执行下一个任务单元。所以当同步码执行完后就会发现有个微任务,所以第二个就输入”我是微任务“,就到了两个宏任务了,因为写的setTimeout时间都是一样的,所以就看前后顺序了,是第一个setTimeout宏任务执行先,这个任务单元下,肯定就是同步任务代码先执行,所以就输出了”我是宏任务1“,​​然后就看也没有微任务,发现有微任务就执行了”我是第一个宏任务中的微任务“,​​然后就在队列后注册了一个setTimeout宏任务,但不会先执行,因为第二个宏任务比他先注册,而且时间是一样。然后就到了第二个宏任务,一样先执行了同步代码,输出了”我是宏任务2“,然后又往队列后注册了一个setTimeout宏任务,然后就到了宏任务1注册的宏任务,输出”我是第一个宏任务里面的第一个宏任务“,然后执行第二个宏任务注册的宏任务,就输出”我是第二个宏任务里面的第一个宏任务“。

因为我们这里用的setTimeout都是一样的时间,所以输出是这样,但如果setTimeout写了时间,答案又会不一样的。

如果我这样写,输出就是2 1 

因为,两个会放在工作线程里,当下面的setTimeout到了500毫秒,他就会放进任务队列,

当,而上面的setTimeout还没到1000毫秒,就要等,当函数执行栈空了,任务队列第一个就会进去执行,就输出2。上面的setTimeout到1000毫秒就进入了任务队列,然后就输出了1.所以并不是先看谁先注册,我们发现任务队列并不是⼀下⼦就会将任务2和任务三⼀起放进去,⽽是哪个计时器到时间了哪个放进去。

 谢谢

猜你喜欢

转载自blog.csdn.net/ZHUzhuzhu08/article/details/122058430