
获得徽章 4
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇文章
赞了这篇沸点
发现网上很多关于事件循环和宏/微任务的说法是有问题的,文章就不重复写了,澄清一下细节把。
所谓宏任务,是由游览器生成的;所谓微任务,是由JS引擎生成的。生成宿主不同,任务的级别也就不同。类似于操作系统设计了【线程】的概念,但是应用程序设计了【协程】的概念。
宏/微任务其实可以举例为:你在银行柜台办业务,排了一个长队,你们都是【宏任务】,但是轮到你时,你一下子办理了很多事情,比如【转账、办新卡和办信用卡】,这3个事情就是你产生的【微任务】,只有帮你办理完这些,后面那些人才有机会办理业务【宏任务】。
强调一下,有些人可能会以为,只有异步任务才是宏任务,其实并不是如此。比如,script代码、DOM解析这些。
对于游览器的主线程而言,所有任务执行时,最终都是【同步】的,不管你是【延迟】,还是【不延迟】的,最终只有在可以执行时,才会放到【消息队列】,由主线程拉取到执行栈。
在遇到定时器延迟、网络请求时,都是其他线程负责去处理了,消息队列里面这个时候没有它们,只有这些事情异步完成后,才会进入到【消息队列】,然后被拉取执行。
所以,不要把事件循环里面的宏任务和异步与否混在一起了,宏/微代表的只是任务级别,异步/同步代表的是执行时机,对于事件循环这个【死循环】来说,只有现在能执行时,才会进入它的法眼,管你触发是异步还是同步呢,没完成时,不要找我【进消息队列】。
最后,附带一个学习链接:time.geekbang.org。
PS:没有所谓定时器线程,想想也对,主线程完全可以给延迟任务打个时间标记,然后主线程每次根据当前时间进行时间对比检查就是了,和前端localStorage加缓存时间设置一个道理。
所谓宏任务,是由游览器生成的;所谓微任务,是由JS引擎生成的。生成宿主不同,任务的级别也就不同。类似于操作系统设计了【线程】的概念,但是应用程序设计了【协程】的概念。
宏/微任务其实可以举例为:你在银行柜台办业务,排了一个长队,你们都是【宏任务】,但是轮到你时,你一下子办理了很多事情,比如【转账、办新卡和办信用卡】,这3个事情就是你产生的【微任务】,只有帮你办理完这些,后面那些人才有机会办理业务【宏任务】。
强调一下,有些人可能会以为,只有异步任务才是宏任务,其实并不是如此。比如,script代码、DOM解析这些。
对于游览器的主线程而言,所有任务执行时,最终都是【同步】的,不管你是【延迟】,还是【不延迟】的,最终只有在可以执行时,才会放到【消息队列】,由主线程拉取到执行栈。
在遇到定时器延迟、网络请求时,都是其他线程负责去处理了,消息队列里面这个时候没有它们,只有这些事情异步完成后,才会进入到【消息队列】,然后被拉取执行。
所以,不要把事件循环里面的宏任务和异步与否混在一起了,宏/微代表的只是任务级别,异步/同步代表的是执行时机,对于事件循环这个【死循环】来说,只有现在能执行时,才会进入它的法眼,管你触发是异步还是同步呢,没完成时,不要找我【进消息队列】。
最后,附带一个学习链接:time.geekbang.org。
PS:没有所谓定时器线程,想想也对,主线程完全可以给延迟任务打个时间标记,然后主线程每次根据当前时间进行时间对比检查就是了,和前端localStorage加缓存时间设置一个道理。
展开

评论
6
赞了这篇文章