【问题标题】:Using the GWT Scheduler使用 GWT 调度程序
【发布时间】:2011-07-05 02:29:06
【问题描述】:

我很难理解com.google.gwt.core.client.Scheduler 接口的各种方法之间的区别,特别是scheduleDeferredscheduleFinallyscheduleIncremental 方法。

我认为,由于我不熟悉调度程序文档所引用的浏览器事件处理循环,我的理解受到了阻碍。

您能否解释一下这些方法之间有何不同,以及它们在浏览器事件循环中的工作方式?

【问题讨论】:

    标签: gwt browser event-handling scheduling


    【解决方案1】:

    JavaScript(在浏览器中)是单线程的。事件循环模型意味着,我们总是处于以下两种状态之一:

    • 在事件循环中
    • 执行事件处理程序

    有很多种事件:点击事件、onload 事件、XHR 事件、计时器事件……您必须声明一些处理程序(在页面加载期间至少有一个),否则您的代码将永远不会执行。其中之一是您通过实现onModuleLoad 指定的处理程序。

    保持所有处理程序简短很重要,因为没有并行性和中断(除了最后的“无响应脚本”中断)。这意味着,在浏览器返回事件循环之前,用户无法与界面交互 - 而这不会在当前处理程序完成之前发生。

    因此,如果您想将某些代码推迟到其他事件处理程序有机会之后,那么您可以使用Scheduler.scheduleDeferred

    Scheduler.scheduleIncremental 帮助您将真正长时间运行的任务拆分为多个步骤,让其他事件处理程序在每个步骤之间有机会。

    Scheduler.scheduleFinally 只是表示:在处理了我们当前的处理程序之后(即使发生异常),但在返回事件循环之前,执行我的命令。

    com.google.gwt.core.client.impl.Impl.entry0()

    【讨论】:

    • 如果我想更改 DOM 或 CSS 样式,然后再继续我的长时间运行的事件处理程序的其余部分,该怎么办?对剩余部分使用 scheduleDeferred 或 scheduleIncremental 会导致页面更改立即可见吗?
    • @David:将更改 DOM/样式的代码保留在当前处理程序中。将剩余部分移入 scheduleDeferred。更改将在 ScheduledCommand 执行之前重新呈现。
    • 一个 scheduleDeferred 的例子应该让事情更清楚。你可以检查一下,约翰·拉布兰卡特别回答。 groups.google.com/group/google-web-toolkit/browse_thread/thread/…
    • @ChrisLercher 我没明白。 scheduleDeferred 和 scheduleFinally 有什么区别。我什么时候用什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多