som*_*esh 1 java gwt scheduler
我对 GWT 中的 Schedule defrred 如何工作有疑问。
我的程序中有以下功能:
function()
{
doTask1();
doTask2();
}
doTask1() {
Scheduler.get.scheduleDeferred(new Scheduler.ScheduledCommand) {
System.out.println("In task1");
}
}
doTask2() {
System.out.println("In task2");
}
Run Code Online (Sandbox Code Playgroud)
我期望的是以下将是输出:
In task1
In task2
Run Code Online (Sandbox Code Playgroud)
但我得到的输出是:
In task2
In task1
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我的理解是 ScheduleDeferred 只处理用户输入,如鼠标点击等。它是否也会以这种方式影响功能行为?
JavaScript(至少在浏览器中)使用事件队列和轮询该队列的主线程。当您调用 时Scheduler.scheduleDeferred,setTimeout会在 JavaScript 中以 1 毫秒的延迟调用。这将在延迟到期后在浏览器中将“计时器触发”事件排队,并将SchedulerCommand您作为参数传递(实际上,在 中涉及另一个队列Scheduler,但这不会改变整个操作流程)。
所以,你的代码在这里说的是:将“In task1”延迟 1 毫秒,然后打印“In task2”,然后在 1 毫秒后(以及可能处理队列中存在的其他事件之后),打印“In task1”。
有关如何在浏览器中工作的详细信息,请参阅http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeoutsetTimeout。