Как дождаться окончания асинхронного http, прежде чем продолжить? - PullRequest
4 голосов
/ 08 мая 2011

В GWT есть какой-нибудь способ дождаться завершения асинхронного вызова? Мне нужно, чтобы ответ продолжался (это экран входа в систему, поэтому успех означает переход на реальную игру, а неудача - сохранение входа в экран).
Вот звонок:

private void execRequest(RequestBuilder builder)
{
    try
    {
        builder.sendRequest(null, new RequestCallback()
        {
            public void onError(Request request, Throwable exception)
            {
                s = exception.getMessage();
            }

            public void onResponseReceived(Request request,
                    Response response)
            {
                s = response.getText();
            }
        });
    } catch (RequestException e)
    {
        s = e.getMessage();
    }
}

А вот метод вызова: `

public String check()
{
    s = null;
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, baseUrl
            + "check&user=" + user + "&password=" + password);
    execRequest(builder);
    return s;
}

Мне нужен метод проверки, чтобы вернуть ответ (или ошибку), а не вернуть ноль.
Я попробовал умственно отсталый способ написания: `

while (s == null);

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

Ответы [ 2 ]

6 голосов
/ 09 мая 2011

Обними асинхронность, не борись с ней!

Другими словами: сделайте ваш метод check также асинхронным, передавая аргумент обратного вызова вместо возврата значения; и передать обратный вызов на execRequest (просто замените каждое назначение на s вызовом на обратный вызов). Вам не обязательно запускать событие в шине событий всего приложения, как предположил Джай: это помогает в развязке, но это не всегда то, что вам нужно / нужно.

3 голосов
/ 09 мая 2011

Вы не должны проверять завершение таким образом. Лучшая практика проектирования здесь - запускать пользовательское событие, когда завершается асинхронный вызов входа в систему ... и когда вы получаете событие (через шину событий), вы делаете оставшиеся задачи.

читать дальше http://code.google.com/webtoolkit/articles/mvp-architecture.html#events

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...