在客户端使用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
}
});
}
});
}
});
我知道,我们可以在服务器端组合这三个调用来制作单独的服务方法,但是如果我们需要很多这样的不同方法的组合呢?另一个问题是添加单独的方法,通过简单组合现有方法来执行我们可以获得的功能。
是否有一种通用模式可以摆脱这些代码而不是更改服务器端服务?
答案 0 :(得分:2)
您可以创建命名类,而不是使用匿名类。这将消除令人困惑的嵌套,如果您使用有意义的名称,可能会使您的代码更容易理解。
答案 1 :(得分: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);
}
}
答案 2 :(得分: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);