你好我周末和GWT一起玩,我真的很喜欢我所见过的 至今。我有两个问题:
我真的不了解我的应用程序的执行模型。我认为 那是因为我不知道javascript。我假设有 只有一个逻辑线程来自浏览器运行javascript和它 是更新显示的相同线程(忽略异步 要求)。因此,当通过js我向帧添加50个元素时,50 将所有元素添加到框架后显示元素。在 换句话说,在js完成执行之后。我有吗 对?是否有关于这个主题的文章?
对不起,这不是一个很好的例子,但它可能会引起我的疑问 跨越。在以下情况(设计)中我该怎么办: a)将标签中的文本更新为“开始......” b)做一堆js和dom操作 c)将标签中的文字更新为“已完成!”
目前,我所看到的只是后遗症:我的dom操纵和 “完了”。标签永远不会显示“开始...”
如何强制标签在步骤a&湾我见过 一些帖子描述了一个人可以使用Timer并以某种方式强行 要刷新的元素。但我无法弄清楚这是如何实现的。
期待您的建议。提前谢谢。
答案 0 :(得分:2)
To 1):是的,javascript是单线程的。您可以将长时间运行的操作实现为非阻塞。否则你可能会遇到Slow Script Warnings
(见下一点)。
To 2):看一下IncrementalCommand
类(它的用法描述为here)。通过它,您可以将长时间运行的操作划分为较小的工作块,并向用户显示进度更新。一个小例子:
public class Starter implements EntryPoint {
private Label text = new Label();
private Label update = new Label();
@Override
public void onModuleLoad() {
Button btn = new Button("hit me");
btn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
text.setText("starting...");
startIncrementalWork();
}
});
RootPanel.get().add(text);
RootPanel.get().add(update);
RootPanel.get().add(btn);
}
private void startIncrementalWork() {
IncrementalCommand cmd = new IncrementalCommand() {
private int count = 0;
@Override
public boolean execute() {
if (count >= 10000) {
text.setText("finished");
return false;
}
for (int i = 0; i < 100; i++) {
update.setText("count " + count);
count++;
}
return true;
}
};
DeferredCommand.addCommand(cmd);
}
}
希望有所帮助。