Javascript 事件执行顺序和呈现

Javascript 事件执行顺序和呈现,javascript,html,event-loop,Javascript,Html,Event Loop,var con=document.getElementById'con'; con.onclick=函数{ 承诺、决议、功能承诺1{ con.textContent=0; //requestAnimationFrame=>con.textContent=0 }; }; 这是骗局 为什么此代码在执行微任务后不触发渲染 是的,否则你不会看到文本被更新 也许你不能从你的开发工具中分辨出来 这可能是因为鼠标事件现在通常限制为屏幕刷新率,这意味着当调度鼠标事件的任务将运行时,您已经处于绘制帧中,这可能是由

var con=document.getElementById'con'; con.onclick=函数{ 承诺、决议、功能承诺1{ con.textContent=0; //requestAnimationFrame=>con.textContent=0 }; }; 这是骗局 为什么此代码在执行微任务后不触发渲染

是的,否则你不会看到文本被更新

也许你不能从你的开发工具中分辨出来

这可能是因为鼠标事件现在通常限制为屏幕刷新率,这意味着当调度鼠标事件的任务将运行时,您已经处于绘制帧中,这可能是由于其他原因,因为据我所知,鼠标移动事件是以这种方式限制的,而不是单击。。。。 因此,您只需同步第六步,就可以在这两个步骤开始之前,将currentTask设置为null,开发工具将看到的是一个正常的绘制框架,正如预期的那样。 因此,开发工具可能不会在这里显示任何特殊的内容,但是考虑到您的声明的广泛性,很难确定特定的原因,这只是我的一个理论

您可以尝试通过从此类事件内部调用requestAnimationFrame来验证此理论,并检查它是否在同一事件循环迭代中执行:

onclick=evt=>{ 控制台。清除; setTimeout=>console.log'timeout',0; requestAnimationFrame=>console.log'rAF'; }; 单击任意位置
如果rAF在超时之前被记录,则单击事件在绘制框架中得到处理。请以文本编码,而不是以图像编码。每个问题也有一个问题。console.time'stop'for let index=0;指数<10000e3;index++{}console.timeEnd'stop'。当我试图在消息实例化之前执行此代码时,这次计时器应该在任务队列中。为什么订单是一样的?对不起,我没有按照。。。你是说在Chrome中你做了一些像setTimeoutfn,0;等待10秒;postMessage和希望setTimeout获胜?没有真正的原因不,虽然我猜这是一种未定义的行为,但消息任务仍然直接排队,而setTimeout任务将在1ms解析之后,而这将在当前任务结束之后,而不是在阻塞while循环结束之前。另外,请记住,正如我在回答中所说,UAs可以从事件循环处理模型的第一步选择他们想要的任何任务源,Chrome在消息任务源上设置的优先级可能比计时器上设置的优先级更高,除了SetTimeOut上的1ms最小超时非常感谢您的回答。另外,我想知道chrome是如何实现这一点的。是否有任何理论知识可以让我得到它,或者我只能阅读源代码?是的,阅读源代码,然后检查。我也写了关于这件事的specs视图的主题,其中有一条关于Chrome在其源代码中已经存在的问题的注释。