zoukankan      html  css  js  c++  java
  • KnockoutJS 3.X API 第七章 其他技术(7) 微任务

    注意:本文档适用于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 ;.

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/smallprogram/p/5976582.html
Copyright © 2011-2022 走看看