GWT调度器中scheduleFinally和scheduleDeferred的区别是什么?

GWT调度器中scheduleFinally和scheduleDeferred的区别是什么?,gwt,scheduler,Gwt,Scheduler,我在这个帖子里找不到我的答案: GWT调度程序类具有scheduleDeferred API,该API在浏览器事件循环返回后执行。scheduleFinally API允许我在控件返回到浏览器事件循环之前执行代码 如何决定使用scheduleDeferred还是scheduleFinally?是否有代码示例显示行为的差异?要理解这一点,您需要首先了解事件循环的基本概念。当您编写要在浏览器中运行的代码时,您不会编写此循环-它存在于浏览器中,等待用户执行某些操作。当发生这种情况时(鼠标事件、键盘事

我在这个帖子里找不到我的答案:

GWT调度程序类具有scheduleDeferred API,该API在浏览器事件循环返回后执行。scheduleFinally API允许我在控件返回到浏览器事件循环之前执行代码


如何决定使用scheduleDeferred还是scheduleFinally?是否有代码示例显示行为的差异?

要理解这一点,您需要首先了解事件循环的基本概念。当您编写要在浏览器中运行的代码时,您不会编写此循环-它存在于浏览器中,等待用户执行某些操作。当发生这种情况时(鼠标事件、键盘事件、AJAX调用返回、setTimeout关闭),循环将调用代码,并允许您按照自己的意愿进行处理

首先,我们有scheduleDeferred,这是一种通知浏览器我们有一些代码要运行的方式,但不在这个循环中。这是一种方便的方法,可以让浏览器重新获得控制权,呈现一些内容,然后再次为您提供控制权。这有助于将计算分为几个部分,以避免任何“长时间运行的脚本”错误,也可能是早期尝试制作动画(注意:使用浏览器中的实际requestAnimationFrame api,或者使用GWT中的
AnimationScheduler.get().requestAnimationFrame

接下来,在循环中有两个有趣的地方,您可能有希望运行的代码——要么在浏览器将控制权转移给您时,要么在您再次返回控制权之前。在这两者中,结尾通常更有趣:scheduleFinally。这允许您在当前事件循环中运行一些代码,但直到循环的最后。CssResource在其ensureInjected()方法中使用此策略-当您运行对此方法的多个不同调用时,而不是多次戳DOM,它会将它们全部批处理,并在事件循环结束时使用scheduleFinally运行它们

最后,每个事件循环的开始由另一个方法scheduleEntry管理。理论上,这可以与最终重新实现AngularJS绑定布线的简单版本结合使用

//event comes in to GWT from the $entry method, and follows these steps
try {
  // 1. run registered scheduleEntry calls

  // 2. run the current event or callback that the browser called us for
} finally {
  // 3. run registered scheduleFinally calls
}

在这些步骤中对scheduleDeferred的任何调用都会添加对下一个事件循环的调用,以作为#2的一部分运行。

要理解这一点,您需要首先了解事件循环的基本概念。当您编写要在浏览器中运行的代码时,您不会编写此循环-它存在于浏览器中,等待用户执行某些操作。当发生这种情况时(鼠标事件、键盘事件、AJAX调用返回、setTimeout关闭),循环将调用代码,并允许您按照自己的意愿进行处理

首先,我们有scheduleDeferred,这是一种通知浏览器我们有一些代码要运行的方式,但不在这个循环中。这是一种方便的方法,可以让浏览器重新获得控制权,呈现一些内容,然后再次为您提供控制权。这有助于将计算分为几个部分,以避免任何“长时间运行的脚本”错误,也可能是早期尝试制作动画(注意:使用浏览器中的实际requestAnimationFrame api,或者使用GWT中的
AnimationScheduler.get().requestAnimationFrame

接下来,在循环中有两个有趣的地方,您可能有希望运行的代码——要么在浏览器将控制权转移给您时,要么在您再次返回控制权之前。在这两者中,结尾通常更有趣:scheduleFinally。这允许您在当前事件循环中运行一些代码,但直到循环的最后。CssResource在其ensureInjected()方法中使用此策略-当您运行对此方法的多个不同调用时,而不是多次戳DOM,它会将它们全部批处理,并在事件循环结束时使用scheduleFinally运行它们

最后,每个事件循环的开始由另一个方法scheduleEntry管理。理论上,这可以与最终重新实现AngularJS绑定布线的简单版本结合使用

//event comes in to GWT from the $entry method, and follows these steps
try {
  // 1. run registered scheduleEntry calls

  // 2. run the current event or callback that the browser called us for
} finally {
  // 3. run registered scheduleFinally calls
}
在这些步骤中对scheduleDeferred的任何调用都添加了对下一个事件循环的调用,以作为#2的一部分运行。

可能重复的