Как собрать количество асинхронных обратных вызовов?

Существуют ли какие-либо методы для сбора нескольких результатов обратного вызова службы 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...");
    }
});

Как получить все результаты в одном месте? Спасибо.


person Dmitry    schedule 17.07.2010    source источник


Ответы (2)


Лучшим решением будет Command Patter, как сказал igorbel, но если вы новичок, вы можете спроектировать, например, Bean Container, который содержит только bean-компоненты, которые необходимо транспортировать по одному запросу.

For example:

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;
}

...

}

person kospiotr    schedule 23.07.2010

Почему бы вам не создать новый сервисный метод, который в результате возвращает все данные?

Реализация такого метода может просто вызывать все остальные методы. Вам нужно будет инкапсулировать все необходимые данные и вернуть их как один результат. Один пример того, как вы могли бы справиться с этим:

В реализации услуги:

@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/< /а>

person igorbel    schedule 17.07.2010