Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:
function foo() {
var result;
$.ajax({
url: '...',
success: function(response) {
myCallback(response);
}
});
return result;
}
function myCallback(response) {
// Does something.
}
Это поведение указано в документации по классу CompletionStage
(четвертая пуля) :
Метод
blockquote>handle
дополнительно разрешает этап для вычисления результата замены, который может обеспечить дальнейшую обработку другими зависимыми этапами. Во всех остальных случаях, если вычисление этапа внезапно прекращается с (неконтролируемым) исключением или ошибкой, то все зависимые этапы, требующие его завершения, также выполняются исключительно с помощьюCompletionException
, содержащего исключение в качестве причины .Не удивительно, если вы считаете, что вы можете хотеть знать, была ли эта сцена, вы вызвали
exceptionally
, неудачно или один из ее прямых или косвенные предпосылки.
да, поведение ожидается, но если вы хотите исходное исключение, которое было выбрано с одного из предыдущих этапов, вы можете просто использовать this-
CompletableFuture<String> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException());
future.thenApply(v-> v).exceptionally(e -> {
System.out.println(e.getCause()); // returns a throwable back
return null;
});