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 ;.

  • 相关阅读:
    Android开发之Intent.Action
    package.json中版本号前的符号含义
    npm ERR! code 128
    前端vue项目添加单元测试及sonar配置
    npm ERR! code: 'EPERM' npm安装依赖时报错
    vue单文件中,解决相同ref出现多个的问题
    'NODE_ENV' 不是内部或外部命令,也不是可运行的程序 或批处理文件
    程序调试问题呈现
    Qt三维点云散点数据显示QtDataVisualization
    win环境下获取利用qt获取u盘信息
  • 原文地址:https://www.cnblogs.com/smallprogram/p/5976582.html
Copyright © 2011-2022 走看看