第48天 你对事件循环有了解吗?说说看!
Activity
likeke1997 commentedon Jun 5, 2019
事件循环机制和异步有关。
从阮一峰大佬教程上摘抄的:
myprelude commentedon Jun 13, 2019
浏览器事件循环
node事件循环
Vi-jay commentedon Jul 31, 2019
浏览器事件循环分为
微任务
宏任务
每一次event loop会先执行所有宏任务 然后再执行微任务
settimeout或者ajax这些浏览器api会在其他线程进行 当完成时会将回调任务插入event loop的调用栈,当下一次event loop被执行时 就会执行到该函数
seho-dev commentedon Sep 17, 2019
学习了一波,出了一波笔记
https://www.yinzhuoei.com/index.php/archives/112/
waterkitten commentedon Aug 9, 2020
大家写得差不多了
我补充一些
复制代码
setTimeout 就是作为宏任务来存在的,而 Promise.then 则是具有代表性的微任务,上述代码的执行顺序就是按照序号来输出的。
所有会进入的异步都是指的事件回调中的那部分代码
也就是说 new Promise 在实例化的过程中所执行的代码都是同步进行的,而 then 中注册的回调才是异步执行的。
在同步代码执行完成后才回去检查是否有异步任务完成,并执行对应的回调,而微任务又会在宏任务之前执行。
所以就得到了上述的输出结论 1、2、3、4。
Alex-Li2018 commentedon Aug 11, 2020
这里说错了是先执行微任务再执行宏任务;
smile-2008 commentedon Nov 9, 2020
setTimeout 就是作为宏任务来存在的,而 Promise.then 则是具有代表性的微任务
LeiDeMing commentedon Mar 9, 2021
https://zhuanlan.zhihu.com/p/126705839
xiaoqiangz commentedon Jun 6, 2022
js主线程拥有一个执行栈(同步任务)和一个任务队列(宏任务、微任务),主线程会依次执行。
当遇到同步函数时,会先将函数入栈,函数运行结束后再出栈;
当遇到异步任务时,首先这些任务会返回一个值,让主线程不在此阻塞,使主线程继续执行下去,而真正的任务交给浏览器内核去执行,会将该任务事先定义好的函数加入相应的任务队列(宏任务、微任务)
当js主线程清空执行栈之后,会按先入先出的顺序读取微任务队列的回调函数,并将该函数入栈,继续运行执行栈,直至清空执行栈,再去读取任务队列。
当微任务队列中的任务执行完后,会提取宏任务队列中的一个任务加入微任务队列,接着继续执微任务队列,依次执行直至所有的任务执行结束。
Sobrium commentedon Sep 20, 2022
js 是单线程语言,在同一时间只能执做一件事情,但是如果说是碰见Ajax请求,或者说是setTimeOut等,如果按照单线程来说,就一直会阻塞下面的代码去执行,所以有了同步任务和异步任务的概念。
js中有一个主线程和一个调用栈(也叫执行栈),所有的任务都会放到执行栈中等待主线程去执行。
js调用栈采用后进先出的原则,当函数执行的时候会被添加到栈顶,当执行栈执行完成后,就会被栈顶移除,直到栈内被清空。
js同步任务会在执行栈中按照顺序等待主线程依次执行,异步任务会在异步任务有了结果后,将回调函数添加到任务队列中,等待主线程空闲也就是执行栈被清空后,被读取到栈内等待主线程的执行。
任务队列是一种先进先出的数据结构(队列) 任务队列中分宏任务和微任务两种,常见的宏任务有script setTimeout setIntelval 常见的微任务有promise.then
事件循环(Event Loop) 当执行栈执行完所有的同步任务后会检查执行栈是否为空,如果为空就去检查微任务队列,如果为空的话就去执行宏任务,如果不为空就一次性执行完微任务。
每次单个宏任务被执行完就去检查微任务队列中是否有微任务,如果有则执行完所有微任务。然后继续执行宏任务,依次循环知道所有任务执行完毕。