Как собрать количество асинхронных обратных вызовов? - PullRequest
1 голос
/ 17 июля 2010

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

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

Ответы [ 2 ]

0 голосов
/ 23 июля 2010

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

Например: <pre> public class BeanContainer{ private ArrayList<School> schools = new ArrayList<School>(); private ArrayList<Car> cars = new ArrayList<Car>; private ArrayList<Person> people = ArrayList<Person>();</p> <pre><code>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; } ...

}

0 голосов
/ 17 июля 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...");
    }
});

С этим видомПри подходе вы минимизируете количество сервисных звонков на вашей клиентской стороне.Это не только создает более читаемый код, но и обычно ускоряет клиентскую часть вашего приложения.Вы всегда должны стараться свести к минимуму количество обращений к сервису, в идеале к одному.

Что касается более общего вопроса сбора количества асинхронных обратных вызовов, хорошим подходом является использование Command Pattern .Gwt Remote Action - это библиотека, которая обеспечивает реализацию упомянутого шаблона для выполнения вызовов RPC:

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

...