#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) на случай, если пользователь отменит навигацию.