2014-02-11 48 views
0

我對GWT的日程安排如何工作有疑問。瞭解GWT推遲的日程安排

我在我的程序如下功能:

function() 
{ 
doTask1(); 
doTask2(); 
} 

doTask1() { 
Scheduler.get.scheduleDeferred(new Scheduler.ScheduledCommand) { 
    System.out.println("In task1"); 
} 
} 

doTask2() { 
System.out.println("In task2"); 
} 

我預料的是,以下將輸出:

In task1 
In task2 

但我得到的輸出:

In task2 
In task1 

這是爲什麼?我的理解是ScheduleDeferred只處理像鼠標點擊等用戶輸入。它是否也以這種方式影響函數行爲?

回答

3

JavaScript(至少在瀏覽器中)與事件隊列和主線程輪詢該隊列一起使用。當您撥打Scheduler.scheduleDeferred時,在JavaScript中調用setTimeout延遲1毫秒。這會在延遲過期之後在瀏覽器中排隊一個「定時器觸發」事件,並且您作爲參數傳遞了SchedulerCommand(實際上,Scheduler中包含另一個隊列,但這不會改變整體操作流程)。

所以,你的代碼在這裏說的是:延遲「在任務1」中1毫秒,然後打印「在任務2」中,然後在1毫秒後(並在可能處理隊列中存在的其他事件之後),打印「任務1」。

請參閱http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout關於setTimeout如何在瀏覽器中工作的細節。

+0

感謝您的解釋 – somesh