【发布时间】:2014-03-11 16:54:31
【问题描述】:
我有一个通过单击按钮调用的函数,它需要很长时间才能创建并附加到 DOM 一些元素,所以我想在函数完成时显示一个带有“正在加载”图标的 PopupPanel它必须这样做。请注意,我的函数不会调用服务器,它只会在 UI 中创建一些需要很长时间来计算的元素,所以我没有 onSuccess() 事件或回调函数可以使用。
所以我有我的 PopupPanel:
pp = new PopupPanel();
pp.setTitle("loading....");
pp.setGlassEnabled(true);
然后在点击处理程序上我有以下代码:
public void onClick(ClickEvent event) {
pp.show();
functionWhichTakesaLongTimeToExecute();
pp.hide();
}
由于 JavaScript 是单线程的,我希望 PopUp 会出现,然后 functionWhichTakesaLongTimeToExecute() 执行,然后 PopUp 被隐藏,但发生的是 functionWhichTakesaLongTimeToExecute() 首先执行,需要很长时间才能将元素附加到DOM,只有在它完成它的工作之后才会显示然后隐藏 PopUp。 就像代码一样:
functionWhichTakesaLongTimeToExecute();
pp.show();
pp.hide();
更困扰我的是,如果我在 pp.show() 之后添加 Window.alert("test") 这将中断流程,直到按下警报中的 OK 按钮,这会导致 PopUp 出现在之前警报和之前的函数WhichTakesaLongTimeToExecute() 被调用。 所以下面的代码按预期工作:
pp.show();
Window.alert("test");
functionWhichTakesaLongTimeToExecute();
pp.hide();
有人可以向我解释为什么在调用函数WhichTakesaLongTimeToExecute() 之前不显示PopUp,而是“等待” functionWhichTakesaLongTimeToExecute() 执行,然后才显示它以及为什么添加 Window.alert ("test") 导致它正确显示?
PS:我在IE8和Chrome中都测试过代码,行为是一样的。
【问题讨论】:
标签: javascript gwt