我正在维护包含大量用户组的软件。当管理员点击某个用户的“删除”时,应该发生以下两件事:
事实证明,#2在#1之前完成 - 比赛条件。因此,我想添加一个回调,以便#2在#1成功之前不会执行。
这个代码是否可以被GWT接受以确保#2出现在#1之前?
doTask1();
GWT.runAsync(new RunAsyncCallback()
{
public void onFailure(final Throwable reason)
{
}
public void onSuccess()
{
doTask2();
}
});
答案 0 :(得分:3)
GWT#runAsync()
用于GWT的"code splitting" feature,它允许延迟加载代码(和其他运行时资源),直到需要它们为止。您需要使用GWT的异步操作模式(即AsyncCallback或Command)将回调传递给doTask1()
,一旦异步操作完成,就会调用该回调。例如,如果doTask1()
执行GWT RPC方法:
public void doTask1(final Command onCompletion) {
myRpcService.doTask1(new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
// Error handling
}
@Override
public void onSuccess(Void ignored) {
onCompletion.execute();
}
});
}
public void doTask2() {
// Perform task 2
}
public void doTasks1And2() {
doTask1(new Command() {
@Override
public void execute() {
doTask2();
}
});
}
答案 1 :(得分:0)
不,你仍然可以拥有这种控制流的竞争条件。相反,你想要这样的东西:
doTask1(new MyCallback() {
public void onTask1Complete() {
doTask2();
}
}
doTask1()
需要接受回调,这样一旦完成,它将执行下一个操作。
要了解原因,我们假设doTask1()
和doTask2()
正在进行HTTP调用。除非等到doTask1()
的请求返回,否则您无法保证服务器可能会接收这两个连接的顺序。在您的示例代码中,您在doTask1()
中发出请求(在异步发出请求时立即返回),然后在不等待第一次调用的情况下进行第二次调用。