JS 中的 Promise 是什么意思,相当于 Java 中的 CompletableFuture
CompletableFuture 使用: https://www.cnblogs.com/vipsoft/p/16539793.html
CompletableFuture 打桌球的应用 : https://www.cnblogs.com/vipsoft/p/16579534.html
在 JavaScript 中,Promise 是一种用于处理异步操作的对象,它类似于 Java 中的 Future 或 CompletableFuture,但设计上更轻量且专为异步编程优化。以下是具体对比:
1. 核心概念对比
JavaScript (Promise) |
Java (Future / CompletableFuture) |
|---|---|
| 表示一个异步操作的最终完成(或失败)及其结果值 | 表示一个异步计算的未来结果 |
通过 .then() 和 .catch() 处理结果 |
通过 .get() 阻塞获取结果,或回调(CompletableFuture) |
链式调用(Promise 可以串联多个操作) |
CompletableFuture 支持链式调用(如 .thenApply()) |
| 不可取消 | Future 可通过 .cancel() 取消任务 |
2. 使用场景对比
(1) JavaScript 的 Promise
// 模拟异步上传文件
function uploadFile(tempFilePath) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
resolve("https://example.com/image.jpg"); // 成功返回URL
} else {
reject(new Error("Upload failed")); // 失败返回错误
}
}, 1000);
});
}
// 调用
uploadFile("path/to/image.jpg")
.then(url => console.log("URL:", url))
.catch(err => console.error("Error:", err));
(2) Java 的 CompletableFuture
import java.util.concurrent.CompletableFuture;
// 模拟异步上传文件
public CompletableFuture<String> uploadFile(String tempFilePath) {
return CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) {
return "https://example.com/image.jpg"; // 成功返回URL
} else {
throw new RuntimeException("Upload failed"); // 失败抛出异常
}
});
}
// 调用
uploadFile("path/to/image.jpg")
.thenAccept(url -> System.out.println("URL: " + url))
.exceptionally(err -> {
System.err.println("Error: " + err.getMessage());
return null;
});
3. 关键差异
| 特性 | JavaScript (Promise) |
Java (CompletableFuture) |
|---|---|---|
| 异步结果获取 | 非阻塞,通过回调处理 | 阻塞(Future.get())或非阻塞(回调) |
| 链式操作 | 原生支持 .then() |
需通过 .thenApply()/.thenAccept() 实现 |
| 错误处理 | 集中通过 .catch() 捕获 |
需单独处理异常(exceptionally()) |
| 取消操作 | 不支持 | 支持(Future.cancel()) |
| 多任务组合 | Promise.all()/Promise.race() |
CompletableFuture.allOf()/anyOf() |
4. 为什么前端常用 Promise?
- 非阻塞:JavaScript 是单线程语言,
Promise避免了阻塞主线程。 - 语法友好:配合
async/await可写出接近同步的代码。 - 浏览器原生支持:无需额外库。
5. 对应关系总结
Promise≈CompletableFuture
(更接近,因为都支持链式调用和异步回调)Promise≠Future
(Future缺少链式操作,需阻塞获取结果)
如果需要深入 Java 的异步编程,推荐学习 CompletableFuture,它是 Java 8 对 Promise 理念的直接回应。
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18806151
浙公网安备 33010602011771号