java - 级联/嵌套异步调用的模式

标签 java design-patterns gwt asynchronous

在客户端使用 gwt 时,通常会调用异步方法并在回调方法中进行处理。

asyncService.method(new AbstractAsyncCallback<Number>() {
  @Override
  public void onSuccess(Number num) {
    // do something with number
  }
});

但经常遇到需要从一个异步方法获取结果,传递给另一个异步方法等的情况。这就是为什么我们得到肮脏的级联代码,难以阅读。

asyncService.method(new AbstractAsyncCallback<Number>() {
      @Override
      public void onSuccess(Number num) {
        asyncService.method1(num, new AbstractAsyncCallback<String>() {
          @Override
          public void onSuccess(String str) {
             asyncService.method2(str, new AbstractAsyncCallback<Void>() {
               @Override
               public void onSuccess(Void void) {
                 // do something
               }
             });
          }
        });
      }
    });

我知道,我们可以在服务器端组合这三个调用来制作单独的服务方法,但是如果我们需要很多这样的不同方法的组合怎么办?另一个问题是添加单独的方法,执行我们可以通过现有方法的简单组合获得的功能。

是否有一种通用模式可以摆脱此类代码而不更改服务器端服务?

最佳答案

您概述了一种模式:调用链。仅当第二次调用取决于第一次调用的结果等时才应使用此模式。

如果您可以并行执行请求,您应该这样做。一种选择是在继续之前等待其他方法完成的目标方法。在此示例中,showPerson() 将被调用两次,但它只会在所有数据准备就绪时执行一次。

Integer age = null;
String name = null;

asyncService.method(new AbstractAsyncCallback<Integer>() {
    @Override
    public void onSuccess(Integer num) {
        age = num;
        showPerson();
    }
});
asyncService.method(new AbstractAsyncCallback<String>() {
    @Override
    public void onSuccess(String n) {
        name = n;
        showPerson();
    }
});

private void showPerson() {
    if (name != null && age != null) {
        myView.showPerson(name, age);
    }
}

关于java - 级联/嵌套异步调用的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12816893/

相关文章:

java - System.getProperty ("user.dir") 通过 Web 服务执行时给出 Eclipse 的路径

java - '没有合适的驱动程序'错误Android mySql

java - 给定一个可变类,如何使这个类的特定对象不可变?

c# - 为什么泛型 ICollection 不在 .NET 4.5 中实现 IReadOnlyCollection?

php - 在 CRUD 中将创建和更新作为一项操作

Java - 处置模式

JavaFx PerspectiveCamera - fixedEyeAtCameraZero 标志 - 当为真时,所有对象都会消失

java - 有没有类似Github的GWT主题?

java - 如何在 GWT 中将自定义 HTML 元素注册为小部件

gwt - Java GWT remoteLoggingServlet - 我可以配置 java.util.Logging 以将其发送到日志文件吗?