系统:Windows 11
宏任务和微任务的执行顺序是先宏后微。先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。
宏任务有:script (可以理解为外层同步代码);setTimeout/setInterval3;UI rendering/UI事件;postMessage,MessageChannel5. setImmediate,I/O(Node.js)
微任务有:Promise2.process.nextTick(Node.js); Object.observe(已废弃;Proxy 对象替代);MutaionObserver。
微任务和宏任务主要区别在于他们的执行顺序,Event Loop的走向和取值。
宏任务和微任务皆为异步任务,它们都属于一个队列。宏任务:当前调用栈中执行的代码成为宏任务。(主代码快,定时器等等)。微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务,可以理解为回调事件。。 宏任务中的事件放在callback queue中,由事件触发线程维护;微任务的事件放在微任务队列中,由js引擎线程维护。
在执行栈中执行一个宏任务,执行过程中遇到微任务,将微任务添加到微任务队列中。当前宏任务执行完毕,立即执行微任务队列中的任务。当前微任务队列中的任务执行完毕,检查渲染,GUI线程接管渲染。渲染完毕后,js线程接管,开启下一次事件循环,执行下一次宏任务(事件队列中取)。
异步任务定义
说到异步任务,我们第一时间想到的是多线程,我们常说的多线程问题,一般是指线程并发问题和数据同步问题。而异步任务属于多线程编程的一个环节:主线程在继续当前任务的同时,创建一个或多个新的非阻塞线程去执行其他任务。
当主流程外需要执行1个或多个复杂计算,为了保障执行效率,可以使用异步任务。异步任务的主要作用是最大程度地使用服务器的性能,提升程序的响应速度。无需获取响应结果的简单异步 如:消息通知。需要响应结果的异步 如:商品信息查询。