Проблема с областью действия GWT RPC

У меня проблема с сохранением результата 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);

оболочка - это составной элемент, который добавляется к моей панели RootLayoutPanel. Он содержит DivElement, InnerText которого устанавливается shell.setError (String). оболочка также имеет LoginWidget с SpanElement, InnerText которого устанавливается shell.getLoginWidget (). setUserName (String). userName - это, очевидно, строка, инициализированная по умолчанию.

Проблема в том, что shell.setError ("Имя пользователя равно" + имя пользователя + "!"); (внутри AsyncCallback) устанавливает InnerText для того, кто в настоящее время вошел в систему. НО shell.getLoginWidget (). setUserName (userName); (вне AsyncCallback) устанавливает для InnerText значение «по умолчанию».

Я перепробовал так много разных вещей, и у всех, кажется, одна и та же проблема со сферой действия. Что меня действительно смущает, так это то, что этот пример показывает почти то же самое техника для сохранения результата RPC.


person tleef    schedule 10.10.2011    source источник


Ответы (1)


Методы GWT RPC являются асинхронными - их возвращаемые значения недоступны сразу. . Поток управления опубликованным вами кодом выглядит следующим образом:

  1. Установите userName на "по умолчанию".
  2. Спросите authService о UserData. Это запускает асинхронный XMLHttpRequest для UserData.
  3. Установите userName в виджете входа в систему на текущее значение userName, которое является «по умолчанию».
  4. Некоторое время спустя асинхронный запрос, инициированный на шаге 2, вернется, и в этот момент переменной userName будет присвоено возвращаемое значение.

Правильно указать имя пользователя в onSuccess методе AsyncCallback:

public void onSuccess(UserData result) {
  userName = result.getUserName();
  shell.getLoginWidget().setUserName(userName);
}
person Jason Terk    schedule 10.10.2011