5

在客户端使用 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
               }
             });
          }
        });
      }
    });

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

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

4

3 回答 3

2

您可以创建命名类,而不是使用匿名类。这将消除令人困惑的嵌套,如果您使用有意义的名称,可能会使您的代码更易于理解。

于 2012-10-10T10:44:15.283 回答
2

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

如果您可以并行执行请求,那么您应该这样做。一种选择是在继续之前等待其他方法完成的目标方法。在这个例子中 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);
    }
}
于 2012-10-10T12:12:09.957 回答
0

我们通常更喜欢使用匿名回调实现来定义变量,这些变量在代码中处于同一级别,因此它们更具可读性,我们倾向于对它们进行排序以理解工作流程。另一个目标是这些回调可以重复使用。

  AsyncService asyncService = GWT.create(AsyncService.class);

  AsyncCallback<Number> onMethod1Response = new AbstractAsyncCallback<Number>() {
    public void onSuccess(Number num) {
      asyncService.method2(onMethod2Response);
    }
  };

  AsyncCallback<String> onMethod2Response = new AbstractAsyncCallback<String>() {
    public void onSuccess(String str) {
      // do something
    }
  };  

  asyncService.method1(onMethod1Response);
于 2012-10-11T05:43:13.827 回答