事件循环究竟宏任务先执行还是微任务先执行? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
weimo383
V2EX    Node.js

事件循环究竟宏任务先执行还是微任务先执行?

  •  
  •   weimo383 2021-03-14 00:21:39 +08:00 via Android 3149 次点击
    这是一个创建于 1746 天前的主题,其中的信息可能已经有所发展或是发生改变。
    查了下 stack overflow 都说是先执行宏任务。。。
    One go-around of the event loop will have exactly one task being processed from the macrotask queue (this queue is simply called the task queue in the WHATWG specification). After this macrotask has finished, all available microtasks will be processed, namely within the same go-around cycle. While these microtasks are processed, they can queue even more microtasks, which will all be run one by one, until the microtask queue is exhausted
    这和国内面试题解释完全不一样啊
    12 条回复    2021-03-20 07:35:55 +08:00
    yyzcl
        1
    yyzcl  
       2021-03-14 00:33:33 +08:00
    jinliming2
        2
    jinliming2  
       2021-03-14 00:53:38 +08:00   3
    本身顺序就是 宏-微-宏-微-宏-微-宏-微 这样交替着来的。入口肯定是宏任务,然后在入口代码中有创建微任务和宏任务的代码,入口代码执行完之后,立即执行微任务,然后再取队列里的下一个宏任务。
    其实是一样的,描述的起点不同罢了。
    国内说先执行微任务,再执行宏任务,这是相对于当前宏任务执行完毕之后这一个时刻来说的,当前宏任务执行完毕之后,会先清空微任务,再去执行下一个宏任务。所以是“先微任务,再宏任务”。
    而你复制的这段描述的是,一个宏任务+一个微任务组成“一对”,这是相对于整个流程开头来说的,执行完一个宏任务后立即再去清空微任务,这样完成一套事件的过程。所以是“先宏任务,再微任务”。
    两种说法都没问题,你要说哪个描述更准确,那我更偏向于“宏+微是一体”的“先宏后微”的描述,毕竟“先微后宏”的描述要强调是在当前宏任务执行完这个时间点。
    autoxbc
        3
    autoxbc  
       2021-03-14 01:08:09 +08:00   1
    宏任务容易有歧义,不如换成宏任务和宏队列
    weimo383
        4
    weimo383  
    OP
       2021-03-14 01:13:49 +08:00 via Android
    @jinliming2 谢谢大佬解释!仔细想想<script>标签解析确实是最开始的宏任务接着会立即执行微任务
    weimo383
        5
    weimo383  
    OP
       2021-03-14 01:16:41 +08:00 via Android
    @autoxbc 请问歧义是指?
    autoxbc
        6
    autoxbc  
       2021-03-14 01:23:36 +08:00
    @weimo383 #5 分不清是当前正在执行的任务还是队列里等候的。其实英文原文里有 queue 这个词,应该翻译出来
    codehz
        7
    codehz  
       2021-03-14 01:26:17 +08:00
    浏览器和 nodejs 的有一点点小区别,建议还是别依赖这个顺序写东西好(
    Sparetire
        8
    Sparetire  
       2021-03-14 01:40:55 +08:00 via Android
    看节点是 nodejs,那就不是浏览器了,那严格来讲不存在宏任务微任务这个概念,只看事件循环的几个阶段就完事了
    leelz
        9
    leelz  
       2021-03-14 08:47:47 +08:00
    没有整体 script(宏任务)先执行哪来的微任务
    Biwood
        10
    Biwood  
       2021-03-14 11:28:12 +08:00 via iPhone
    微任务是后来的概念,属于向事件轮询的每一个 Tick 末尾插入的 jobs 。

    别忘了每个 Javascript 代码块的执行本身就是宏任务,微任务是在执行宏任务时被插入到队列的。

    与其简单回答先后问题,不如了解一下整个运行机制。参考:
    https://developer.mozilla.org/zh-CN/docs/Web/API/HTML_DOM_API/Microtask_guide#%E4%BB%BB%E5%8A%A1_vs_%E5%BE%AE%E4%BB%BB%E5%8A%A1

    https://www.yuque.com/ostwind/you-dont-know-js/async-performance-ch1#Jobs
    himself65
        11
    himself65  
       2021-03-20 01:43:03 +08:00 via iPad
    weimo383
        12
    weimo383  
    OP
       2021-03-20 07:35:55 +08:00 via Android
    @himself65 好家伙回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3381 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 10:43 PVG 18:43 LAX 02:43 JFK 05:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86