Events 发布事件登记、发送、接收和活动/地点的顺序

Events 发布事件登记、发送、接收和活动/地点的顺序,events,gwt,gwt-mvp,Events,Gwt,Gwt Mvp,我刚刚完成了关于活动/地点和MVP的第一个示例。所有工作正常,但如果我换回一个地方(从另一个地方),某些事件无法正常发送或接收。但在“moduleLoad”上,这个位置被设置为默认位置,一切正常。我认为在moduleLoad(通过historyHandler=new PlaceHistoryHandler(historyMapper);historyHandler.register(placeController,eB,defaultPlace);historyHandler.HandleCur

我刚刚完成了关于活动/地点和MVP的第一个示例。所有工作正常,但如果我换回一个地方(从另一个地方),某些事件无法正常发送或接收。但在“moduleLoad”上,这个位置被设置为默认位置,一切正常。我认为在moduleLoad(通过historyHandler=new PlaceHistoryHandler(historyMapper);historyHandler.register(placeController,eB,defaultPlace);historyHandler.HandleCurrenthHistory();)或placeController.goTo(place);)上启动位置/活动不会有什么区别,应该吗

通过调试,我检查了事件注册、事件发送和事件接收的顺序(全部在活动的开始(…)中执行)。问题是,如果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
}
(在启动时发送此事件的用例是,我想说没有选择任何内容-事件的有效负载为null)


问题在于,如果通过goTo调用start(),则不会调用演示者或活动的onSelected-method。但在所有情况下(通过调试器检查),在发送事件之前都会发生注册事件。我该怎么办?

Javascript不是多线程的

当您调用goTo()方法时,您的活动将一个接一个地启动。如果在start()内触发事件,则将在其余活动启动之前调度该事件。因此,处理该事件的活动很可能尚未启动(注册尚未完成)

您可以使用以下代码解决问题:

Scheduler.get().scheduleDeferred(new ScheduledCommand()
{
    @Override
    public void execute()
    {
        //Fire the event
    }
});
调度器是GWT提供的一个实用程序类。ScheduleDeferred将在当前浏览器事件循环返回后执行该命令

因此,通过将此代码粘贴到start()中,您知道在每个活动启动后将立即触发事件。

“注册未完成”是否意味着-如果调试器说已到达注册的代码行,则可能是错误的?正如我所说的,在触发事件之前,我调试了它-其他活动已注册到它。同时,我理解了它;-)。thx它现在正在工作(我使用scheduleFinally)