2011-02-27 26 views
26

我很難理解com.google.gwt.core.client.Scheduler接口的各種方法之間的差異,特別是scheduleDeferred,scheduleFinallyscheduleIncremental方法之間的差異。使用GWT調度程序

由於我不熟悉調度程序文檔涉及的瀏覽器事件處理循環,因此我的理解受到了很多限制。

您能否介紹一下這些方法在瀏覽器事件循環方面的差異?

回答

42

JavaScript(在瀏覽器中)是單線程的。該事件循環模式意味着,我們總是以完全相同兩種狀態:

    事件循環
  • 執行的事件處理程序

有許多種事件

  • :點擊事件,加載事件,XHR事件,計時器事件......你必須聲明一些處理程序(至少在頁面加載期間),否則你的代碼將永遠不會執行。其中之一是您通過執行onModuleLoad指定的處理程序。

    由於沒有並行性和中斷(除了最後的手段「無響應腳本」中斷),保持所有處理程序都很短很重要。這意味着,用戶無法與界面交互,直到瀏覽器返回到事件循環 - 並且在當前處理程序完成之前不會發生。

    所以如果你想推遲一些代碼,直到其他事件處理程序有機會後,那麼你可以使用Scheduler.scheduleDeferred

    Scheduler.scheduleIncremental幫助您將真正長時間運行的任務分成多個步驟,爲其他事件處理程序在每個步驟之間提供機會。

    Scheduler.scheduleFinally只是意味着:處理我們當前的處理程序(即使發生異常)後,但在返回到事件循環之前,請執行我的命令。

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

  • +2

    如果我想做出改變的DOM,或者CSS樣式,與我的長期運行的事件處理程序的剩餘部分,然後再繼續?對其餘部分使用scheduleDeferred或scheduleIncremental是否會導致頁面更改立即可見? – David 2011-02-27 10:02:31

    +0

    @David:保留更改當前處理程序中DOM /樣式的代碼。將餘數移入scheduleDeferred。在ScheduledCommand執行之前,這些更改將被重新渲染。 – 2011-02-27 10:12:09

    +1

    scheduleDeferred的一個例子應該讓事情更清楚。你可以檢查一下,特別是John Lablanca的回答。 http://groups.google.com/group/google-web-toolkit/browse_thread/thread/47a669dc8e6b2469?pli=1 – Vicky 2011-04-11 03:34:30