GWT: лучший способ сделать начальный вызов RPC при запуске? - PullRequest
2 голосов
/ 27 октября 2011

Каков наилучший способ выполнить начальный вызов RPC при запуске с GWT?

Я хотел бы получить данные конфигурации, которые динамически генерируются на стороне сервера, когда пользователь загружает страницу.но если я выполняю асинхронный вызов RPC из браузера для извлечения данных, я иногда не получаю ответ до полной загрузки страницы, в результате чего страница не имеет доступа к этим данным конфигурации.(без функции Thread.sleep (), например)

спасибо


благодаря ответу @ Steve-J, я нашел решение ...

В основномИдея заключается в следующем:

  • создать новое событие StartupCompleted
  • запустить начальный вызов RPC в onModuleLoad ()
  • в методе onSucess этого вызова RPC,запускать событие StartupCompleted
  • в конце метода go () Контроллера приложений вместо вставки действия по умолчанию в History [с помощью History.newItem («default»));] или для запуска текущего состояния истории, если оно вызывается с помощью закладки [with History.fireCurrentHistoryState ();], ничего не делать
  • зарегистрировать обработчик для нового события StartupCompleted на шине событий
  • при возникновении события StartupCompleted, перехватить его и в это время вставить действие по умолчанию вистория или запуск текущего состояния истории

et voila ...

Первоначальный вызов RPC завершен, прежде чем делать что-либо еще ...

Что-то не так?с таким подходом?

Заметьте, что, как подсказывает @ Tom-Miette, было бы хорошо иметь простое сообщение "загрузка ...", пока не будет получено событие StartupCompleted.

Ответы [ 4 ]

3 голосов
/ 27 октября 2011

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

Не забудьте включить стеклянную панель в ваших всплывающих окнах, чтобы пользователь не мог ничего связывать с фоном во время ожидания.

Обновление: Из комментариев: «Но моя проблема в том, что пользователь может добавить страницу в закладки и перейти к ней напрямую без какого-либо взаимодействия. Я могу оказаться в том случае, если я не получил результатвызов RPC, но там, где я генерирую запрошенную им страницу. Даже если в этом поколении я пытаюсь проверить, получил ли я результат, я не могу остановиться, пока это не произойдет, до завершения генерации страницы. "

Ах, понятно.ОК, у GWT есть решение для этого.Вы должны посмотреть на Развлечения и места .Когда пользователь делает закладку на «страницу», он действительно отмечает состояние приложения GWT.Когда он возвращается на эту «страницу», Activity запускается и автоматически вызывает метод start ().Это ваша возможность получить данные с сервера и выполнить любые другие необходимые настройки.Когда у вас есть данные, ваш метод start () приступает к настройке так называемого «представления».С точки зрения пользователя "страница" "загружена".

3 голосов
/ 27 октября 2011

Не уверен, что это лучший способ, но хороший способ - вообще избежать первоначального вызова и использовать страницу jsp вместо страницы html в качестве точки входа в приложение. Затем вы можете установить переменные для вашего начального состояния в javascript на стороне сервера страницы, например,

<script type="text/javascript">
    var InitialState = {
    "userName" : "<%= userName %>",
    "emailAddress" : "<%= emailAddress %>",
    etc...
};

В вашем приложении GWT вы можете прочитать эти значения, используя класс GWT Dictionary

Dictionary state = Dictionary.getDictionary("InitialState");
String userName = state.get("userName");
String emailAddress = state.get("emailAddress");
0 голосов
/ 09 мая 2013

FWIW У меня было решение, которое включает приостановку EntryPoint.onModuleLoad () до возвращения RPC.

Я использовал внедрение зависимостей и GWTP Dispatch , что усложняло процесс начальной загрузки. Я также хотел, чтобы результат был одноэлементным экземпляром в моей системе (на стороне клиента).

Результатом стал собственный вызов RPC GWT (без шаблона команды), который запустил внедрение зависимости в случае успеха.

EntryPoint Фрагмент класса:

@Override
public void onModuleLoad() {
    SessionInfoProvider.init(new Runnable() {
        @Override
        public void run() {
            // can now complete setup
            AppInjector injector = GWT.create(AppInjector.class);
            injector.bootstrap();
        }
    });
}

SessionInfoProvider фрагмент:

public class SessionInfoProvider implements Provider<SessionInfo> {
private static SessionInfo.Bean sessionInfo;

/**
 * Needs to be called before the module is used.
 */
public static void init(final Runnable onCompletion) {
    GreetingServiceAsync s = GWT.create(GreetingService.class);
    s.loadSessionInfo(new AsyncCallback<SessionInfo.Bean>() {
        @Override
        public void onFailure(Throwable caught) {
            GWT.log("Failed to retrieve Session Info");
        }

        @Override
        public void onSuccess(SessionInfo.Bean result) {
            GWT.log("Successfully retrieved session info bean.  Username:" + result.getUserName());
            sessionInfo = result;
            onCompletion.run();
        }
    });
}

@Override
public SessionInfo get() {
    if (sessionInfo == null) throw illegalState("Session Info not ready.");
    return sessionInfo;
}
}
0 голосов
/ 27 октября 2011

Накройте свою html-страницу своего рода «экраном загрузки»:

<div 
id="loading"
style="
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  background: black;
  color: white;"
>
  Loading...
</div>

и просто удалите его, когда RPC успешно / неудачно:

RootPanel.get("loading").getElement().removeFromParent();
...