在客户端使用 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/