Проблема с порядком регистрации событий, отправки, получения и мероприятий/мест

Я только что закончил свой первый собственный пример с действиями/местами и MVP. все работает нормально, но некоторые события не отправляются или не принимаются должным образом, если я возвращаюсь к месту (из другого места). но на "moduleLoad", где это место установлено как место по умолчанию, все работает нормально. я думаю, что не должно иметь значения, запущено ли место/активность при загрузке модуля (через historyHandler = new PlaceHistoryHandler(historyMapper); historyHandler.register(placeController, eB, defaultPlace); historyHandler.handleCurrentHistory();) или через placeController. идти (место); , должно ли?

с помощью отладки я проверил порядок регистрации событий, отправки и получения событий (все выполняется в начале (...) действия). проблема в том, что все получатели не получают событие, если start() выполняется через goTo(place) (регистрация и отправка работают нормально). Но если событие отправлено после start() или внутри start()-выполняется на moduleLoad, все работает нормально!

начало моей активности выглядит так:

@Override
public final void start(final AcceptsOneWidget panel, final EventBus eventBus) {
// register events - to manipulate visibility of some display areas
eventBus.addHandler(SelectedEvent.TYPE, this);
//initiate presenters -(pseudo code)
[presenter that receives SelectedEvent]
[presenter that sends SelectedEvent]
//ading presenter's asWidgets to screen -> panel.setWidget..
...
}

@Override
public final void onSelected(final SelectedEvent event) {
   //do something
}

(вариант использования для отправки этого события при запуске заключается в том, что я хочу сказать, что ничего не выбрано - полезная нагрузка события равна нулю)

проблема в том, что ни ведущий, ни метод onSelected активности не вызываются, если start() вызывается через goTo. Но во всех случаях (проверено отладчиком) регистрация на событие происходит до его отправки. Что я должен делать?


person dermoritz    schedule 16.06.2011    source источник


Ответы (1)


Javascript не является многопоточным.

Когда вы вызываете метод goTo(), ваши действия будут запущены одно за другим. Если вы запускаете событие внутри start(), событие будет отправлено до того, как будут запущены остальные действия. Таким образом, есть большая вероятность, что активность, обрабатывающая это событие, еще не запущена (регистрация не была выполнена).

Вы можете решить свою проблему с помощью следующего кода:

Scheduler.get().scheduleDeferred(new ScheduledCommand()
{
    @Override
    public void execute()
    {
        //Fire the event
    }
});

Scheduler — это служебный класс, предоставляемый GWT. ScheduleDeferred выполнит команду после возврата текущего цикла событий браузера.

Итак, вставив этот код в start() , вы знаете, что событие будет запущено, как только будет запущено каждое действие.

person Garagos    schedule 21.06.2011
comment
регистрация не была выполнена означает ли это, что может быть ошибка, если отладчик говорит, что строка кода для регистрации достигнута? как я уже сказал, я отладил его, и перед тем, как запустить событие, на него было зарегистрировано другое действие. - person dermoritz; 30.06.2011
comment
я тем временем я понял это ;-). спасибо, теперь все работает (я использую scheduleFinally) - person dermoritz; 22.11.2011