如何在页面切换AsyncCallback的onSuccess中执行代码

时间:2014-03-02 00:00:35

标签: gwt gwt-rpc

GWT的新手,哦!这个学习曲线......

所以,我正在测试我实现的身份验证功能:当通过AsyncCallback查询当前用户的角色时,首先检查用户是否登录。这是在我自己的AsyncCallback实现中完成的(参见How to redirect to login page after session expire in GWT RPC call)。如果发现未登录,则会发生以下情况:

Widget returnToWidget = RootPanel.get(MyApp.Default_RootPanel_Id).getWidget(0);
RootPanel.get().add(new LoginPage(returnToWidget));

LoginPage清除RootPanel,添加虚拟FlowPanel并弹出带有用户名/密码/提交小部件的DialogBox。如果接受凭据,则添加到提交窗口小部件的ClickListener会执行以下操作:

@Override
public void onSuccess() {
    RootPanel.get().clear();
    RootPanel.get().add(returnToWidget);

现在,这工作正常。为了解决实际问题,请允许我返回查询调用,该调用发生在MainPanel extends Composite

public MainPanel() {
    final DockPanel dockPanel = new DockPanel();
    initWidget(dockPanel);
    final HorizontalPanel hPanel = new HorizontalPanel();
    hPanel.add(new Button("TEST"));

    authService.getUserRole(jSessionId, new AsyncCallback<Constants.UserRole>() {
        @Override
        public void onSuccess(UserRole currentUserRole) {
            boolean isAdmin = currentUserRole.isAtLeast(Constants.UserRole.Administrator);
            if (isAdmin) {
                hPanel.add(createNewStudyButton);
            }
            hPanel.add(new Button("ButtonForAll"));
            System.out.println("CODE EXECUTED!");
        [...]
        }
    [...]

    dockPanel.add(hPanel, DockPanel.NORTH);
    System.out.println("THROUGH!");
}

当发生我的GWT应用程序时,MainPanel在EntryPoint中实例化并添加到RootPanel,导致控制台打印 THROUGH!,登录显示屏幕并在提供接受的管理员凭据后,已将MainPanel的已传递实例添加到RootPane

不幸的是(这就是问题!),只显示了TEST按钮。控制台永远不会打印 CODE EXECUTED!。为什么@success响应中的代码没有被执行?刷新页面时,会执行代码并显示所有按钮,因为authService.getUserRole现在可以在不中断登录屏幕的情况下返回结果。

我真的非常喜欢repaint()或类似的东西,但这个问题似乎更像是一个设计问题。

任何人都可以帮助我执行代码块,即使AsyncCallback在返回结果之前进行了页面切换吗?

更新:

我的坏!发现问题,但没有解决,因为我不认为它在这个设计中是可解决的:

我的SecurityAsyncCallback引用了默认的AsyncCallback,在onSuccess(T result)上,它只是将结果传递给默认的AsyncCallback,因此它到达了实际的调用者。我在设计中处理NotLoggedInException抛出服务器端的设计,例如authService.getUserRole是要在我的SecurityAsyncCallback onFailure中抓住它并显示登录屏幕...但是从这里我无法重新运行导致onFailure的代码,以便调用者将体验onSuccess,因为用户现在已登录; AsyncCallback接口只是一个中介,用于在调用者和被调用者之间传递结果,并且不知道调用了什么。

嗯,我真正追求的是,​​当用户深入我的应用程序,离开他的计算机和他的登录时间时,我希望登录页面显示在下一个服务器端访问,然后重定向他到他来自哪里(也就是说,登录后不回到默认页面)。我想我可以通过使用History子系统来实现这一点,但我还没有尝试过这个。

0 个答案:

没有答案