我正在维护包含许多用户组的软件。当管理员在组的用户上单击"删除"时,应该发生两件事:
- 删除组成员(涉及更新缓存,数据库等)
- 重新加载组成员列表(用户删除用户时,他会看到此列表)
事实证明,#2在#1-比赛状态之前结束。结果,我想添加一个回调,以便#2在#1成功之前才执行。
GWT可以接受此代码,以确保#2发生在#1?
之前。 doTask1();
GWT.runAsync(new RunAsyncCallback()
{
public void onFailure(final Throwable reason)
{
}
public void onSuccess()
{
doTask2();
}
});
GWT#runAsync()
用于GWT的"代码拆分"功能,该功能允许延迟加载代码(和其他运行时资源),直到需要它们为止。您需要使用GWT的异步操作模式(即asynccallback或命令)将回调传回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();
}
});
}
否,您仍然可以具有这种控制风格的种族条件。相反,您想要这样的东西:
doTask1(new MyCallback() {
public void onTask1Complete() {
doTask2();
}
}
doTask1()
需要接受回调,以便完成下一个操作后,它将执行下一个操作。
了解为什么,让我们假设doTask1()
和doTask2()
都在调用HTTP调用。您无法保证服务器可能会收到这两个连接的订单,除非您等到doTask1()
的请求返回。在您的示例代码中,您在doTask1()
中提出请求(在请求时立即返回),然后在不等待第一个的情况下进行第二个调用。