当前位置: 首页 > web >正文

Controller返回CompletableFuture到底是怎么样的

以下是关于 CompletableFuture<String> 返回值和前端接收值的详细解析:

1. 后端返回的本质

  • 返回类型‌:CompletableFuture<String> 是一个 ‌未完成的异步任务容器‌,不是直接返回结果值
  • 实际传输‌:Spring 会等待 Future 完成,最终将 ‌String 类型的实际结果‌ 序列化为 JSON/文本响应

2. 前端接收的表现

场景前端接收值说明
正常完成"resultData" (String)如 processRequest() 返回 "data123"
异步超时HTTP 504 超时错误需配置 spring.mvc.async.request-timeout
执行异常HTTP 500 错误 + 异常信息可通过 @ExceptionHandler 捕获

3. 完整交互流程

javaCopy Code

// 后端示例 @GetMapping("/data") public CompletableFuture<String> getData(@RequestParam String key) { return CompletableFuture.supplyAsync(() -> { return "Processed: " + key; // 实际业务逻辑 }, asyncExecutor); }

javascriptCopy Code

// 前端调用示例 (使用 Fetch API) fetch('/api/data?key=test123') .then(response => response.text()) // 获取String结果 .then(data => console.log(data)) // 输出: "Processed: test123" .catch(error => console.error(error));


4. 关键特性对比

特性CompletableFuture 返回值传统同步返回值
HTTP 协议仍然是同步响应同步响应
线程占用立即释放主线程阻塞至完成
前端感知无差异(最终结果相同)无差异
超时控制需额外配置自动跟随servlet超时

5. 进阶用法

若需要真正流式响应,应改用 ‌ResponseBodyEmitter‌:

javaCopy Code

@GetMapping("/stream") public ResponseBodyEmitter streamData() { ResponseBodyEmitter emitter = new ResponseBodyEmitter(); CompletableFuture.runAsync(() -> { try { emitter.send("Chunk1"); Thread.sleep(1000); emitter.send("Chunk2"); emitter.complete(); } catch (Exception e) { emitter.completeWithError(e); } }); return emitter; }


常见误区纠正

  • ❌ 误区1:前端会收到 Future 对象
    ✅ 事实:Spring 自动解包 Future,前端只看到最终结果
  • ❌ 误区2:需要特殊前端代码处理异步
    ✅ 事实:HTTP 协议本身无状态,前端调用方式与同步接口完全一致

通过这种设计,系统既能实现后端异步处理优化吞吐量,又对前端保持接口透明性。

http://www.xdnf.cn/news/19880.html

相关文章:

  • Ubuntu系统镜像源配置
  • 数据结构——树(03二叉树,与路径有关的问题,代码练习)
  • SPI片选踩坑实录(硬件片选和软件片选)
  • Base64编码的作用与应用场景
  • 利用 Java 爬虫获取淘宝商品 SKU 详细信息实战指南
  • 美团龙猫(longcat.AI)编写的利用二分查找优化Excel的sheet.xml指定范围输出C程序
  • 【数学建模学习笔记】时间序列分析:ARIMA
  • Scikit-learn从入门到实践:Scikit-learn入门-安装与基础操作
  • Qwen3-Reranker-0.6B 模型结构
  • Shell脚本一键监控平台到期时间并钉钉告警推送指定人
  • 自动化基本技术原理
  • 嵌入式解谜日志-网络编程
  • Kafka面试精讲 Day 5:Broker集群管理与协调机制
  • 基于SQLite的智能图片压缩存储系统:代码解析与实战应用
  • QuickUp-Ubuntu
  • FPGA AD7606串行驱动与并行驱动
  • 【Flask + Vue3 前后端分离管理系统】
  • 友思特案例 | 食品行业视觉检测案例集锦(三)
  • 利用 Python 获取微店商品关键词搜索 API 接口数据的实战指南
  • 利用飞算Java打造电商系统核心功能模块的设计与实现
  • 硬件开发(1)—单片机(1)
  • atomic常用类方法
  • VR智慧楼宇技术:打造智能办公空间的卓越方案​
  • 深圳外贸峰会究竟藏着啥秘密?能让外贸人收获满满?
  • RHEL9源码编译MySQL8.0.40
  • 图像加密安全传输--设备端视频流加密,手机端视频流解密,使用ChaCha20-Poly1305 进行系统分析
  • 爬虫-----最全的爬虫库介绍(一篇文章让你成为爬虫大佬,爬你想爬)
  • windows系统离线安装Ollama、创建模型(不使用docker)、coze调用
  • Linux为什么不是RTOS
  • 【Vue】前端 vue2项目搭建入门级(一)