GWT回调实施

时间:2012-10-19 20:31:25

标签: gwt callback

我正在维护包含大量用户组的软件。当管理员点击某个用户的“删除”时,应该发生以下两件事:

  1. 删除组成员(涉及更新缓存,数据库等)
  2. 重新加载组成员列表(用户在删除用户时看到此列表)
  3. 事实证明,#2在#1之前完成 - 比赛条件。因此,我想添加一个回调,以便#2在#1成功之前不会执行。

    这个代码是否可以被GWT接受以确保#2出现在#1之前?

     doTask1();
    
     GWT.runAsync(new RunAsyncCallback()
     {
       public void onFailure(final Throwable reason)
       {
       }
    
       public void onSuccess()
       {                       
         doTask2();
       }
     });
    

2 个答案:

答案 0 :(得分:3)

GWT#runAsync()用于GWT的"code splitting" feature,它允许延迟加载代码(和其他运行时资源),直到需要它们为止。您需要使用GWT的异步操作模式(即AsyncCallbackCommand)将回调传递给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()中发出请求(在异步发出请求时立即返回),然后在不等待第一次调用的情况下进行第二次调用。