我有一个艰难的时间,了解各种方法之间的差异com.google.gwt.core.client.Scheduler接口,具体而言,scheduleDeferred,scheduleFinally,和scheduleIncremental方法.
我认为,由于我不熟悉调度程序文档所涉及的浏览器事件处理循环,因此我的理解受到了阻碍.
您能否解释一下这些方法之间的区别,以及它们如何与浏览器事件循环相关联?
我有一个单击按钮就调用的函数,它需要很长时间才能创建一些元素并将其附加到DOM,所以我想在函数完成操作后显示带有“正在加载”图标的PopupPanel。做。请注意,我的函数不会调用服务器,它只会在UI中创建一些元素,这些元素需要很长时间才能计算出来,因此我没有onSuccess()事件或回调函数。
所以我有我的PopupPanel:
pp = new PopupPanel();
pp.setTitle("loading....");
pp.setGlassEnabled(true);
Run Code Online (Sandbox Code Playgroud)
然后在点击处理程序上,我有以下代码:
public void onClick(ClickEvent event) {
pp.show();
functionWhichTakesaLongTimeToExecute();
pp.hide();
}
Run Code Online (Sandbox Code Playgroud)
由于JavaScript是单线程的,因此我期望PopUp会出现,然后执行functionWhichTakesaLongTimeToExecute(),然后将PopUp隐藏,但是发生的是首先执行functionWhichTakesaLongTimeToExecute(),这需要很长时间才能将元素附加到DOM,并且只有在完成工作后才显示PopUp,然后将其隐藏。好像代码是:
functionWhichTakesaLongTimeToExecute();
pp.show();
pp.hide();
Run Code Online (Sandbox Code Playgroud)
更让我困扰的是,如果我在pp.show()之后添加Window.alert(“ test”),这将中断流程,直到按下警报中的“确定”按钮,这会导致PopUp出现在警报和在调用functionWhichTakesaLongTimeToExecute()之前。因此,以下代码按预期工作:
pp.show();
Window.alert("test");
functionWhichTakesaLongTimeToExecute();
pp.hide();
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么在调用functionWhichTakesaLongTimeToExecute()之前为什么不显示PopUp,而是“等待” functionWhichTakesaLongTimeToExecute()执行,直到它显示之后,以及为什么添加Window.alert(“ test ”)使其正确显示?
PS:我已经在IE8和Chrome中测试了代码,并且行为相同。