1

收集多个gwt-rpc服务回调结果有什么技巧吗?

我有一个用于创建新对象或编辑现有对象的对话框窗口。这些对象有许多对其他对象的引用。因此,当用户创建或编辑一个对象时,他可能会在 ListBox 中选择一个。

public class School {
    private String name;
    private String address;
}

public class Car {
    private String model;
    private String type;
}

public class Person {
    private String firstName;
    private String lastName;
    private School school;
    private Car firstCar;
}

当对话框窗口出现在屏幕上时,它应该请求所有引用字段的所有可用值。这些值是通过 gwt-rpc 使用 AsyncCallback 请求的,所以我可以一个一个地处理它。

service.getAllSchools(new AsyncCallback<List<School>>() {
    @Override
    public void onSuccess(List<School> result) {
        fillSchoolListBox(result);
    }

    @Override
    public void onFailure(Throwable caught) {
        Window.alert("ups...");
    }
});
...
service.getAllSchools(new AsyncCallback<List<Car>>() {
    @Override
    public void onSuccess(List<Car> result) {
        fillCarListBox(result);
    }

    @Override
    public void onFailure(Throwable caught) {
        Window.alert("ups...");
    }
});

如何将所有结果集中在一个地方?谢谢。

4

2 回答 2

0

为什么不创建一个新的服务方法来返回所有数据作为结果呢?

这种方法的实现可以简单地调用所有其他方法。您必须封装所有必需的数据并将其作为单个结果返回。一个如何处理的例子:

在服务实现中:

@Override
public Data getAllData(){

    List<Cars> cars = this.getAllCars();
    List<School> schools = this.getAllSchools();

    return new Data(cars, schools);
}

然后你可以使用这样的方法:

service.getAllData(new AsyncCallback<Data data>() {
    @Override
    public void onSuccess(Data data) {
        fillCarListBox(data.getCars());
        fillSchoolListBox(data.getSchools());
    }

    @Override
    public void onFailure(Throwable caught) {
        Window.alert("Pogreska...");
    }
});

通过这种方法,您可以最大限度地减少客户端的服务调用次数。这不仅会创建更易读的代码,而且通常会加快应用程序的客户端速度。您应该始终尽量减少服务调用的数量,最好是单个。

关于收集大量异步回调的更一般的问题,一个好的方法是使用命令模式。Gwt Remote Action 是一个库,它提供了上述模式的实现来进行 RPC 调用:

http://code.google.com/p/gwt-remote-action/

于 2010-07-17T10:44:20.203 回答
0

最好的解决方案是 igorbel 所说的命令模式,但如果你是初学者,你可以设计例如 Bean Container,它只包含必须在一个请求中传输的 bean。

例如:

public class BeanContainer{
    private ArrayList<School> schools = new ArrayList<School>();
    private ArrayList<Car> cars = new ArrayList<Car>;
    private ArrayList<Person> people = ArrayList<Person>();

public void addSchool(School school){
    this.schools.add(school);
}

public void addSchoolCollection(ArrayList<School> schools){
    this.schools.add(schools);
}

public ArrayList<School> getSchoolCollection(){
    return schools;
}

...

}

于 2010-07-23T12:01:05.017 回答