В GWT асинхронный вызов уже выполняется, если мы сейчас обновим браузер, это событие будет запущено, но процесс не завершится

#java #gwt

#java #gwt

Вопрос:

В GWT асинхронный вызов уже выполняется, и я запущу событие после завершения этого вызова. Если мы сейчас обновим браузер, это событие будет запущено, но процесс не завершится, как я могу это решить. Пожалуйста, помогите.

Это блок кода, который я использую:

  private void rpcMethod(final String nounToTrack, final ImportResultDTO importResult,         final String selectedNounName) {
        service.checkNounImportExportStatus(nounToTrack, new AsyncCallback<String>() {
            @Override
            public void onFailure(final Throwable caught) {
                if (caught instanceof StatusCodeException) {
                    eventBus.fireEvent(new CurrentNotificationChangedEvent(true));
                } else {
                    caught.printStackTrace();
                    rpcToRemoveNounImportExportStatusAttribute(nounToTrack);
                }
                clearDataGridHeaders();
            }

            @Override
            public void onSuccess(final String result) {

                if (result.equals(BodDeskMessageConstants.COMPLETED) || result.contains(BodDeskMessageConstants.EXCEPTIONSTATUS)) {
                    if (result.contains(BodDeskMessageConstants.EXCEPTIONSTATUS)) {
                        eventBus.fireEvent(new CurrentNotificationChangedEvent(true));
                    } else {
                        log.info("new notification is occurring..... 3");
                        eventBus.fireEvent(new CurrentNotificationChangedEvent(true));
                    }
                }  else {
                    rpcToCheckNounImportExportStatus(nounToTrack, importResult, selectedNounName);
                }
            }
        });
    }
  

если вызов rpc завершился неудачно / успешно, мы запускаем событие, чтобы увидеть новое доступное уведомление. Теперь, когда я запустил этот rpc-вызов, я обновил браузер во время выполнения rpc-вызова. Событие запускается, но процесс не завершен. Пожалуйста, предложите, как ограничить запуск события?

Комментарии:

1. Я думаю, вы получите исключение StatusCodeException при закрытии сокета. Проверьте код состояния. Возможно, вы сможете решить свою проблему, найдя специальный код состояния.

Ответ №1:

Когда вы выгружаете страницу (что также происходит при ее обновлении), все текущие запросы прерываются, и вы получаете StatusCodeException с getStatusCode() 0 (примечание: вы получите одинаковое поведение, независимо от того, какой триггер для прерывания запроса: ошибка сети и т.д.)

Затем вы могли бы проверить код состояния в своем onFailure , но если вы не хотите ложных срабатываний для других случаев кода состояния 0, вам придется прослушать WindowClosingEvent и установить там флаг. Просто не забудьте установить флаг обратно при каком-либо другом событии (например, успешном ответе или сбое, отличном от 0) на случай, если пользователь отменит навигацию.