KnockoutJS 3.X API 第七章 其他技术(7) 微任务
2016-10-19 11:26
218 查看
注意:本文档适用于Knockout 3.4.0及更高版本。
Knockout的微任务队列
Knockout的微任务队列支持调度任务尽可能快地运行,同时仍然是异步的,努力安排它们在发生I / O,回流或重绘之前发生。 它在内部用于Knockout组件以维护异步行为,以及用于安排可观察量的延迟更新。ko.tasks.schedule(function () { // ... });
这将把提供的回调函数添加到微任务队列。 Knockout包括快速任务队列,以FIFO顺序运行任务,直到队列为空。 当第一个任务被调度时,Knockout将使用浏览器的微任务支持来调度flush事件(如果可能)。 这确保了第一个任务和后续任务的行为相似。
可以使用从ko.tasks.schedule返回的句柄值取消微任务。 如果任务已经运行或以前已取消,则取消不执行任何操作。
var handle = ko.tasks.schedule(/* ... */); ko.tasks.cancel(handle);
错误处理
如果任务抛出异常,它不会中断任务队列,这将继续,直到它是空的。 异常将被推迟到稍后的事件,并可以使用ko.onError或window.onerror处理。递归任务限制
由于Knockout处理微任务队列直到它为空,而不会导致外部事件,许多或冗长的任务可能会导致浏览器页面变得无响应。 如果检测到高级别的递归,则通过取消所有剩余的任务,Knockout可以防止无限递归。 例如,以下将最终停止并抛出一个错误:function loop() { ko.tasks.schedule(loop); } loop();
实施
当第一个任务被调度时(最初和之前的flush事件已经完成),Knockout将调度一个flush事件来处理微任务队列。 如果可能,它将尝试使用浏览器自己的微服务功能。 在现代浏览器中,它将使用DOM变异观察器,在旧版本的Internet Explorer中,它将使用<script> onreadystatechange事件。 这些方法允许它在任何回流或重绘之前开始处理队列。 在其他浏览器中,它将恢复使用setTimeout。高级队列控制
Knockout提供了一些高级方法来控制何时处理微任务队列。 如果您想将Knockout的微服务系统与另一个库集成或者添加对其他环境的支持,这些功能非常有用。ko.tasks.runEarly()— 调用此方法根据需要立即处理当前微任务队列,直到它为空。 除了库集成,您可以使用此方法,如果您有代码调度一些任务,但随后需要同步处理这些任务的影响。
ko.tasks.scheduler— 覆盖此方法以重新定义或扩充Knockout如何计划事件以处理和刷新队列。 当第一个任务被调度时,Knockout调用此方法,因此它必须调度事件并立即返回。 例如,如果您的应用程序在Node.js中运行,您可能更喜欢对flush事件使用process.nextTick:ko.tasks.scheduler = process.nextTick ;.
相关文章推荐
- KnockoutJS 3.X API 第七章 其他技术(2) 使用扩展器来增加可观察量(监控属性)
- KnockoutJS 3.X API 第七章 其他技术(4) 速率限制
- KnockoutJS 3.X API 第七章 其他技术(3) 延迟更新
- KnockoutJS 3.X API 第七章 其他技术(6) 使用“fn”添加自定义函数
- KnockoutJS 3.X API 第七章 其他技术(5) 使用其他事件处理程序
- KnockoutJS 3.X API 第七章 其他技术(8) 异步错误处理
- KnockoutJS 3.X API 第七章 其他技术(1) 加载和保存JSON数据
- KnockoutJS 3.X API 第四章(14) 绑定语法细节
- KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定
- KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定
- KnockoutJS 3.X API 第四章 表单绑定(12) selectedOptions、uniqueName绑定
- KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
- KnockoutJS 3.X API 第四章之事件event绑定
- KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
- KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定
- KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
- KnockoutJS 3.X API 第四章之数据控制流component绑定
- KnockoutJS 3.X API 第四章 数据绑定(2) 控制流foreach绑定
- KnockoutJS 3.X API 第四章之click绑定
- KnockoutJS 3.X API 第四章 表单绑定(6) click绑定