我怀疑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只关注用户输入,如鼠标点击等。它是否也以这种方式影响功能行为?
答案 0 :(得分:3)
JavaScript(至少在浏览器中)使用事件队列和主线程轮询该队列。当您致电Scheduler.scheduleDeferred
时,会在JavaScript中调用setTimeout
,延迟时间为1毫秒。这将在延迟过期后在浏览器中对“计时器触发”事件进行排队,并将SchedulerCommand
作为参数传递(实际上,Scheduler
中涉及另一个队列,但这不会改变整体行动)。
所以,你的代码在这里说的是:延迟“在task1”中1毫秒,然后打印“在task2”,然后在1毫秒之后(并且在可能处理队列中存在的其他事件之后),打印“在task1中”
有关setTimeout
在浏览器中如何运作的详细信息,请参阅http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout。