Проблема области действия GWT RPC - PullRequest
0 голосов
/ 11 октября 2011

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

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

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

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

1 Ответ

1 голос
/ 11 октября 2011

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

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

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

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