2

我正在维护包含一堆用户组的软件。当管理员在组的用户上单击“删除”时,应该会发生两件事:

  1. 删除组成员(涉及更新缓存、数据库等)
  2. 重新加载组成员列表(用户在删除用户时会看到此列表)

事实证明,#2 在 #1 之前完成 - 竞争条件。因此,我想添加一个回调,以便在 #1 成功之前 #2 不会执行。

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

 doTask1();

 GWT.runAsync(new RunAsyncCallback()
 {
   public void onFailure(final Throwable reason)
   {
   }

   public void onSuccess()
   {                       
     doTask2();
   }
 });
4

2 回答 2

3

GWT#runAsync()用于 GWT 的“代码拆分”功能,它允许延迟加载代码(和其他运行时资源),直到需要它们。您需要使用 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();
    }
  });
}
于 2012-10-19T23:24:16.667 回答
0

不,您仍然可以使用这种控制流风格来获得竞争条件。相反,你想要这样的东西:

doTask1(new MyCallback() {
    public void onTask1Complete() {
       doTask2();
    }
}

doTask1()需要接受一个回调,以便一旦完成,它将执行下一个操作。

要了解原因,让我们假设两者doTask1()doTask2()在进行 HTTP 调用。除非您等到doTask1()请求返回,否则您无法保证服务器接收这两个连接的顺序。在您的示例代码中,您发出请求doTask1()(在异步发出请求时立即返回),然后进行第二次调用而不等待第一次。

于 2012-10-19T23:33:03.420 回答