是否有任何技术可以收集大量的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;
}
当屏幕上出现对话框窗口时,它应该请求所有引用字段的所有可用值。 AsyncCallback通过gwt-rpc请求这些值,所以我可以逐个处理它。
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...");
}
});
如何在一个地方获得所有结果? 感谢。
答案 0 :(得分: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调用的上述模式的实现:
答案 1 :(得分:0)
igorbel说,最好的解决方案是命令模式,但如果你是初学者,你可以设计一个Bean容器,它只包含必须在一次请求时运输的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;
}
...
}