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

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.dtcms.com/a/362880.html

相关文章:

  • 【DSP28335 入门教程】定时器中断:为你的系统注入精准的“心跳”
  • 在windows平台oracle 23ai 数据库上使用bbed
  • zephyr设备树的硬件描述转换为c语言
  • 梳理一下 @types/xxx
  • 【Python语法基础学习笔记】竞赛常用标准库
  • 数据库的锁级别
  • Git在idea中的实战使用经验(一)
  • 深度学习之第五课卷积神经网络 (CNN)如何训练自己的数据集(食物分类)
  • SQLShift 实现Oracle 到 OceanBase 的存储过程转换初体验
  • FlowGPT-GPT提示词分享平台
  • 深入剖析Java设计模式之策略模式:从理论到实战
  • 【音视频】 WebRTC GCC 拥塞控制算法
  • 从Java全栈到前端框架:一场真实的技术面试实录
  • Leetcode二分查找(5)
  • 【算法】哈希表专题
  • 单元测试总结2
  • 【大前端】Vue 和 React 主要区别
  • dy图文批量下载
  • 【C++】模板(初阶)--- 初步认识模板
  • 从一行 var a = 1 开始,深入理解 V8 引擎的心脏
  • 【Linux我做主】进程退出和终止详解
  • 掌握设计模式--模板方法模式
  • 前缀树约束大语言模型解码
  • Ollama:本地大语言模型部署和使用详解
  • 【论文阅读】DeepSeek-LV2:用于高级多模态理解的专家混合视觉语言模型
  • ObjectMapper一个对象转json串为啥设计成注入?...
  • 【学Python自动化】 7. Python 输入与输出学习笔记
  • Pandas Python数据处理库:高效处理Excel/CSV数据,支持分组统计与Matplotlib可视化联动
  • 车载刷写架构 --- ECU软件更新怎么保证数据的正确性?
  • Ansible 循环、过滤器与判断逻辑