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能够防止无限递归。 例如,如下将最终中止并抛出一个错误:oop
function loop() { ko.tasks.schedule(loop); } loop();
当第一个任务被调度时(最初和以前的flush事件已经完成),Knockout将调度一个flush事件来处理微任务队列。 若是可能,它将尝试使用浏览器本身的微服务功能。 在现代浏览器中,它将使用DOM变异观察器,在旧版本的Internet Explorer中,它将使用<script> onreadystatechange事件。 这些方法容许它在任何回流或重绘以前开始处理队列。 在其余浏览器中,它将恢复使用setTimeout。spa
Knockout提供了一些高级方法来控制什么时候处理微任务队列。 若是您想将Knockout的微服务系统与另外一个库集成或者添加对其余环境的支持,这些功能很是有用。 code
ko.tasks.runEarly()
— 调用此方法根据须要当即处理当前微任务队列,直到它为空。 除了库集成,您可使用此方法,若是您有代码调度一些任务,但随后须要同步处理这些任务的影响。blog
ko.tasks.scheduler
— 覆盖此方法以从新定义或扩充Knockout如何计划事件以处理和刷新队列。 当第一个任务被调度时,Knockout调用此方法,所以它必须调度事件并当即返回。 例如,若是您的应用程序在Node.js中运行,您可能更喜欢对flush事件使用process.nextTick:ko.tasks.scheduler = process.nextTick ;.递归