时间:2021-07-01 10:21:17 帮助过:22人阅读
首先判断JS是同步还是异步,同步就进入主进程,异步就进入event table
异步任务在event table中注册函数,当满足触发条件后,被推入event queue
同步任务进入主线程后一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有就推入主进程中
macro-task(宏任务):包括整体代码script,setTimeout,setInterval,setImmediate, I/O, UI rendering
micro-task(微任务):Promise.then,process.nextTick
执行本轮个宏任务
过程中如果遇到微任务,是同步任务就将其放到微任务的[事件队列]里,异步放入微任务[事件表]中,注册函数,达到执行条件,推入微任务[事件队列]中 (目前为止我还不知道微任务有没有异步任务)
遇到宏任务,是同步任务就将其放到宏任务的[事件队列]里,异步放入宏任务[事件表]中,注册函数,达到执行条件,推入宏任务[事件队列]中
本轮宏任务执行完,查看微任务的[事件队列],并将里面全部的微任务依次执行完,从宏任务[事件队列]中执行下一轮宏任务
JS单线程,这线程中只有一个唯一的事件循环
一个线程中,事件循环是唯一的,但是可以有多个任务队列(微任务队列只有一个)
任务队列分宏任务队列与微任务队列
/* example1 */ setTimeout(function () { console.log(1); },7); new Promise(function (resolve) { console.log(2); for (var i = 0; i < 10000; i++) { i == 99 && resolve(); } }).then(function () { console.log(3); setTimeout(() => { console.log(4); }); }) console.log(5); // 2 3 5 (4 7) 后两个数字的顺序与两定时器的delayTime有关,谁先满足触发条件就先输出谁 (html5 标准中,规定delayTime >= 4ms) /* example2 */ setTimeout(_ => console.log(4)); new Promise(resolve => { resolve() console.log(1) }).then(_ => { console.log(3) Promise.resolve().then(_ => { console.log('before timeout') }).then(_ => { Promise.resolve().then(_ => { console.log('also before timeout') }) }) }) console.log(2); // 这个也不难,分析分析就出结果了
综上 菜鸡二问
微任务事件队列中存在异步任务嘛?
多个宏任务事件队列,下一轮宏任务时该从哪个宏任务事件队列中取?
相关推荐:
细说JavaScript事件循环机制-第二讲
JavaScript运行机制之事件和回调函数
以上就是理解JavaScript 事件机制的详细分析的详细内容,更多请关注Gxl网其它相关文章!