Java 8中对应JavaScript Promise.reject的等效实现是什么?
Java 8中对应JavaScript Promise.reject的实现
你说的没错,Java 8的CompletableFuture确实没有直接提供和JavaScript Promise.reject()完全对等的静态方法——这个便捷方法是Java 9才新增的CompletableFuture.failedFuture(Throwable)。不过在Java 8里,我们可以手动实现一个完全等效的逻辑,有两种常见方式:
推荐方式:手动创建并标记为失败状态
我们可以直接实例化CompletableFuture,然后调用它的completeExceptionally()方法来标记其为失败状态,完全不需要额外线程开销:// 封装成工具方法,方便复用 public static <T> CompletableFuture<T> failedFuture(Throwable exception) { CompletableFuture<T> future = new CompletableFuture<>(); future.completeExceptionally(exception); return future; } // 使用示例 CompletableFuture<String> rejectedFuture = failedFuture(new RuntimeException("模拟错误"));这个工具方法的行为就和
Promise.reject()完全一致:返回一个已经处于失败状态的Future,任何后续附加的回调(比如exceptionally()、handle())都会立即触发异常处理逻辑。不推荐的方式:通过supplyAsync抛出异常
你也可以用supplyAsync()配合直接抛出异常的方式,但这种方式会占用ForkJoin公共线程池的线程,属于没必要的资源浪费,所以一般不推荐:CompletableFuture<String> rejectedFuture = CompletableFuture.supplyAsync(() -> { throw new RuntimeException("模拟错误"); });
如果之后有机会升级到Java 9及以上版本,直接使用官方提供的CompletableFuture.failedFuture(Throwable)就可以了,它就是Java官方实现的Promise.reject()等效方法。
内容的提问来源于stack exchange,提问作者battmanz
相关产品推荐
相关产品推荐

