繁体   English   中英

javascript 代码中的微任务作为宏任务

[英]Microtask as macrotask in javascript code

我在 whatwg 规范中找到了这个注释

如果在初始执行期间,它会旋转事件循环,则可以将微任务移动到常规任务队列。 这是唯一参考微任务的源、文档和脚本评估环境设置object集的情况; 它们被执行微任务检查点算法忽略。

什么是它的一个例子,它表达了这句话? 如何将微任务从微任务堆栈移动到宏任务堆栈并像执行宏任务一样执行?

这是用于showModalDialog的,它用于在模态中加载文档,阻塞初始文档,直到此模态关闭......为此,UA 必须“旋转事件循环”直到模态的文档关闭。 这个“旋转事件循环”宏确实将微任务转换为“简单”任务。

showModalDialog()方法已从规范中删除,但这仍然存在,因为它也可用于其他模式或允许“长任务”被 UA 短路,以便它们可以更新渲染并显示消息向用户介绍长脚本。
例如,在有关暂停的注释中建议了这一点,由所有模态调用,如alert()prompt()等:

暂停对用户体验非常不利,尤其是在多个文档之间共享单个事件循环的情况下。 鼓励用户代理尝试暂停的替代方法,例如旋转事件循环,甚至在没有任何暂停执行的情况下简单地继续,只要可以这样做,同时保持与现有内容的兼容性。

在某些具有无限循环的浏览器中也有这种情况,它们会暂停脚本并显示一条消息,如“此页面上的脚本花费太长时间,您要等待还是用火杀死它? ”。

例如,在 Firefox 中,两种情况都会在向用户显示提示时触发渲染更新,即它们确实会旋转事件循环 因此,如果“暂停”是从微任务内部触发的,他们应该在恢复时将其移至宏任务。

然而 IIRC,他们实际上使用了一个自定义版本的旋转事件循环,它只允许渲染阶段(没有回调),仅此而已。 即使在那里,微任务也没有真正转换为任务。
积极的讨论,计划“删除这个概念”重新进入微任务,因为它实际上并没有被实施者真正使用。 即使是这样,我也不确定我们是否可以观察到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM