gpt4 book ai didi

Java - 使用 CompletableFuture 链中断执行顺序

转载 作者:太空宇宙 更新时间:2023-11-04 11:45:56 26 4
gpt4 key购买 nike

我是 Java 新手,正在使用 CompletableFutures 执行异步操作,如下所示:

public CompletionStage<Either<ErrorResponse, Response>> insertOrUpdate(String actor, String key) {
return this.objectDAO.getByKey(key)
.thenApply(mapDOToContainer(key))
.thenApply(mergeContainerToDO(key, actor))
.thenComposeAsync(this.objectDAO.UpdateFn())
.thenApply(DBResult::finished)
.thenApply(finished -> {
if (finished) {
Response response = Response.ok().build();
return Either.right(response);
} else {
return Either.left(ErrorResponse.create("Error", 400));
}
});
}

现在我需要修改它,以便如果 get 失败,那么我执行上面的链,但如果成功,那么我需要打破这个链并从函数返回一个包含 ErrorResponse 的 Either 对象。

如何打破这个处理链?我知道我可以将一个标志传递给链中的每个函数,并通过根据标志的值执行函数中的操作来实现这一点。我希望有更好的方法来做到这一点。

谢谢!!

最佳答案

我会重写你的代码。

  • 错误时不要使用Either,Java有异常
  • 不要从 DAO 返回 CompletionStage
  • 异常(exception)使用 CompletableFuture,它就是为此而设计的

然后这样做:

public CompletionStage<Response> insertOrUpdate(String actor, String key) {
return CompletableFuture.supplyAsync(() -> this.objectDAO.getByKey(key))
.thenApply(mapDOToContainer(key))
.thenApply(mergeContainerToDO(key, actor))
.thenComposeAsync(this.objectDAO.UpdateFn())
.thenApply(DBResult::finished)
.thenApply(finished -> {
Response response = Response.ok().build();
return response;
})
.exceptionally(e -> ErrorResponse.create("Error", 400));
}

DAO 应该是这样的:

class ObjectDAO {
public Object getByKey(String key) {
if (keyNotFound) {
throw new NoSuchElementException();
}

return new Object();
}
}

您可能必须确保 ErrorResponse 是 Response 的子类才能完成此操作。

关于Java - 使用 CompletableFuture 链中断执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42357577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com