使用GWT调度程序

Dav*_*vid 26 browser gwt scheduling event-handling

我有一个艰难的时间,了解各种方法之间的差异com.google.gwt.core.client.Scheduler接口,具体而言,scheduleDeferred,scheduleFinally,和scheduleIncremental方法.

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

您能否解释一下这些方法之间的区别,以及它们如何与浏览器事件循环相关联?

Chr*_*her 43

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

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

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

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

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

Scheduler.scheduleIncremental 帮助您将长时间运行的任务分成多个步骤,为其他事件处理程序提供每个步骤之间的机会.

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

请参阅com.google.gwt.core.client.impl.Impl.entry0()

  • 如果我想在继续使用长时间运行的事件处理程序的剩余部分之前对DOM或CSS样式进行更改,该怎么办?在余数上使用scheduleDeferred或scheduleIncremental会导致页面更改立即可见吗? (2认同)