即时设置.js
一份YuzuJS的制作
导言
即时设置.js 高度交叉浏览器 setImmediate 财务报告和审定财务报表 clearImmediate APIs, (英语), 拟议 由微软提交网络性能工作组. setImmediate 允许脚本向浏览器屈服,同步执行给定的操作,其方式通常效率更高,消耗的功率也比通常低 setTimeout(..., 0) 模式.
setImmediate.js在以下浏览器和环境中以“全速”运行,使用各种巧妙的技巧:
- 互联网探索者 6+
- Firefox 3+ (英语)
- 网络Kit
- 歌剧院 9.5+
- 节点.js
- 支持浏览器中的网络工人
MessageChannel我找不到可靠的线索.
在所有其他浏览器中,我们回到使用 setTimeout因此,它总是安全的使用.
宏任务和微任务
这个 setImmediate API,按照规定,允许您进入环境 任务队列,有时被称为它的"宏任务"队列. 这一点与 微任务队列 用于网页特性,例如 MutationObserver,语言特征,如承诺和 Object.observe,以及Node.js 等特性 process.nextTick。每个宏任务队列的绕行在全部队列任务处理完毕后返回事件循环,即使宏任务本身排入了更多的宏任务。 然而,微任务队列将继续执行任何已排入队列的微任务,直到它被用尽.
在实践中,这意味着 如果你打电话 setImmediate 在另一个任务队列中 setImmediate,您将返回到事件循环和需要在这些调用之间执行的任何I/O或渲染任务,而不是尽快执行排队的任务.
如果您想作为渲染回路的一部分, 请考虑使用 requestAnimationFrame; 如果您只寻找控制流排序效果, 请使用微任务解决方案, 如 自动。 。 。 .
诡计
process.nextTick
在0.9以下的Node.js版本中, setImmediate 不详,但 process.nextTick 在那些版本中, process.nextTick 使用宏任务语义. 因此,我们用它来支持全球 setImmediate。 。 。 .
在节点0.9和以上, process.nextTick 移动到微任务语义,但 setImmediate 被引入了宏任务语义, 所以不需要多填充任何东西.
注意,我们检查 实际数 节点.js 环境,而不是像由浏览器或类似器生成的环境那样的被模拟. 这种被效仿的环境往往包括: process.nextTick shim,那不像SetImmediate.js那样与浏览器兼容.
postMessage
在Firefox 3+,Internet Explorer 9+,所有现代WebKit浏览器,和Opera 9.5+, postMessage 并提供了在事件回路上排队任务的好方法。 相当的滥用,在同一文档内使用跨文档的通讯协议,只是为了访问事件循环任务队列,但是在有本土执行之前,这是最好的选择.
注意 Internet Explorer 8 包含一个同步版本 postMessage。我们检测到这个,或者任何其他这样的同步执行,然后回到另一个把戏.
MessageChannel
很遗憾, postMessage 网络工人内部有完全不同的语义, 所以不能在那里使用。 所以我们转向 MessageChannel,它有更糟糕的浏览器支持,但确实在网络工人内部工作.
<script> onreadystatechange
最后一招,我们抽出一些东西 在互联网探索者6到8的版本中 使事情变得更快: <script> 并启动我们的呼叫 onreadystatechange 活动。 这确实在事件循环的未来转折中执行,而且速度也快于 setTimeout(…, 0)嘿,为什么不呢?
使用量
在浏览器中,用一个 <script> 标签;非常简单.
在节点.js, do
npm install --save setimmediate
接下来
require("setimmediate"); // (somewhere early in your app; it attaches to the global scope.)