【问题标题】:GWT RPC scope issueGWT RPC 范围问题
【发布时间】:2011-10-10 21:54:29
【问题描述】:

我在保存 RPC 的结果时遇到问题。基本上调用是成功的,但是当我尝试将它保存在一个变量中时,它似乎超出了范围。

private String userName = "default";

authService.retrieveUserData(new AsyncCallback<UserData>() {
        @Override
        public void onSuccess(UserData result) {
            userName = result.getUserName();
            shell.setError("The userName is " + userName + "!");
        }
        @Override
        public void onFailure(Throwable caught) {
            //I've checked and it is not failing.
        }
    });

shell.getLoginWidget().setUserName(userName);

shell 是添加到我的 RootLayoutPanel 的 Composite。它包含一个 DivElement,其 InnerText 由 shell.setError(String) 设置。 shell 也有一个带有 SpanElement 的 LoginWidget,其 InnerText 由 shell.getLoginWidget().setUserName(String) 设置。 userName 显然是一个初始化为“default”的字符串。

问题在于 shell.setError("The userName is " + userName + "!"); (在 AsyncCallback 内)将 InnerText 设置为当前登录的人。但是 shell.getLoginWidget().setUserName(userName); (在 AsyncCallback 之外)将 InnerText 设置为“默认”。

我尝试了很多不同的东西,但它们似乎都有相同的范围问题。真正让我感到困惑的是,this 示例显示了几乎完全相同的技术来保存 RPC 的结果。

【问题讨论】:

    标签: gwt rpc gwt-rpc


    【解决方案1】:

    GWT RPC 方法是asynchronous - 它们的返回值不会立即可用。您发布的代码的控制流程如下:

    1. userName 设置为“默认”。
    2. authService 询问UserData。这会触发 `UserData 的异步 XMLHttpRequest
    3. 将登录小部件中的userName 设置为userName 的当前值,即“默认”。
    4. 一段时间后,在步骤 2 中发起的异步请求将返回,此时 userName 变量将设置为返回值。

    正确的做法是在AsyncCallbackonSuccess方法中设置用户名:

    public void onSuccess(UserData result) {
      userName = result.getUserName();
      shell.getLoginWidget().setUserName(userName);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2010-10-31
      相关资源
      最近更新 更多