同一个请求发送多次,如何保证获取的是最后一次的结果
面试先给结论同一个请求被连续发送多次时要保证最终只采用最后一次请求的结果常见做法有 3 种取消前一次请求只保留最后一次给每次请求打标记 / 序号只处理最新那次响应防抖 / 节流从源头减少重复请求实际项目里最稳妥的是请求取消 响应序号校验这样即使前面的请求没成功取消也不会污染最后的页面状态。一、这个问题的本质是什么这其实是典型的竞态问题race condition。比如搜索框联想输入a发出请求 A很快又输入ab发出请求 B理论上页面应该显示ab的结果但如果网络情况是请求 B 先返回请求 A 后返回那如果你不做处理A 的旧结果就会把 B 的新结果覆盖掉。二、最常见方案 1取消前一次请求这是最直接的。思路每次发新请求前先把上一次请求取消只保留当前这次请求这样就不会出现“旧请求回来覆盖新请求”的问题。axios 示例旧版CancelTokenlet cancelFn null function fetchData(params) { if (cancelFn) { cancelFn(取消上一次请求) } return axios.get(/api/search, { params, cancelToken: new axios.CancelToken((c) { cancelFn c }) }) }新版更推荐AbortControllerlet controller null async function fetchData(params) { if (controller) { controller.abort() } controller new AbortController() try { const res await fetch(/api/search?q${params}, { signal: controller.signal }) const data await res.json() return data } catch (err) { if (err.name AbortError) { console.log(上一次请求已取消) return } throw err } }面试怎么说如果是同一个接口被频繁触发比如搜索建议我会优先在发起新请求前取消上一次请求只保留最后一次请求。这样可以减少无效请求也能避免旧响应覆盖新数据。三、最稳的方案 2请求序号 / 时间戳校验这是非常经典的方案面试里一定要会说。思路每次发请求时给它一个递增 id请求 Aid 1请求 Bid 2请求 Cid 3响应回来时判断只有当前响应 id 等于“最新请求 id”才更新页面否则直接丢弃这样即使旧请求没有被取消它返回了也不会生效。示例let currentRequestId 0 async function fetchData(keyword) { const requestId currentRequestId const res await fetch(/api/search?q${keyword}) const data await res.json() if (requestId ! currentRequestId) { // 说明这不是最后一次请求丢弃结果 return } // 只有最后一次请求才能更新页面 render(data) }优点实现简单不依赖底层请求库是否支持取消对任何异步请求都适用面试表达我会给每次请求加一个递增序号响应回来后判断它是不是最新请求。如果不是最新的就直接忽略。这样可以保证页面最终只使用最后一次请求的结果。这句话很标准。四、最佳实践取消请求 序号校验一起用这是最完整、最专业的回答。因为现实里有两个问题取消请求不一定总能完全阻止后续逻辑有些场景底层请求无法真正取消所以更稳的方式是发新请求前先取消旧请求响应回来后再做一次“是否最新”的判断示例let controller null let latestRequestId 0 async function fetchData(keyword) { if (controller) { controller.abort() } controller new AbortController() const requestId latestRequestId try { const res await fetch(/api/search?q${keyword}, { signal: controller.signal }) const data await res.json() if (requestId ! latestRequestId) return render(data) } catch (err) { if (err.name AbortError) return throw err } }为什么这套最稳取消请求减少无效网络开销序号校验防止旧结果误更新页面五、源头治理防抖如果这个场景是输入框实时搜索除了保证“只取最后一次结果”还应该考虑减少根本没必要发出的请求这时就用防抖。示例function debounce(fn, delay 300) { let timer null return function (...args) { clearTimeout(timer) timer setTimeout(() { fn.apply(this, args) }, delay) } } const search debounce((keyword) { fetchData(keyword) }, 300)适用场景搜索建议输入联想筛选条件变化后请求列表但要注意防抖只是减少请求次数不等于一定能解决竞态问题。所以更严谨的说法是防抖用来减少重复请求取消请求和响应校验用来保证最终结果正确。六、Vue / React 里常见怎么做Vue 里常见于watch(inputValue, ...)输入框搜索列表筛选思路监听关键字变化防抖触发请求每次请求前取消前一次返回后校验是否最新React 里常见于useEffect搜索输入条件筛选会配合AbortController闭包里的 requestId清理函数里取消请求七、如果面试官问“只用时间戳可以吗”可以。比如每次请求记录一个时间戳let latestTime 0 async function fetchData() { const time Date.now() latestTime time const res await fetch(/api/data) const data await res.json() if (time ! latestTime) return render(data) }但是更推荐用递增requestId因为更明确也不会受时间精度影响。八、如果是 Promise怎么保证只取最后一次可以封装一个takeLatest思路。示例function createTakeLatest(asyncFn) { let latestId 0 return async function (...args) { const id latestId const result await asyncFn(...args) if (id ! latestId) return return result } }使用const fetchLatest createTakeLatest(async (keyword) { const res await fetch(/api/search?q${keyword}) return res.json() }) fetchLatest(a).then(res { if (res) render(res) })九、面试标准回答模板你可以直接这样答这个问题本质上是多个异步请求并发导致的竞态问题。比如同一个接口连续请求多次时前一次请求可能比后一次更晚返回从而把最新结果覆盖掉。为了解决这个问题我一般会有三层处理发新请求前取消上一次请求减少无效网络开销给每次请求加递增序号或时间戳响应回来时判断它是不是最新请求只有最新请求才能更新页面如果是输入联想这类高频触发场景再配合防抖从源头减少重复请求。实际项目里我更推荐“取消请求 请求序号校验”一起用这样即使旧请求没有成功取消也能保证最终页面只展示最后一次请求的结果。十、30 秒短答版同一个请求连续发送多次时我会把它当作竞态问题处理。常见做法是发新请求前取消旧请求并且给每次请求加一个 requestId响应回来时只有 id 等于最新值才更新页面。如果是搜索框这类场景还会再加防抖减少无效请求。这样可以保证最终拿到并展示的是最后一次请求的结果。十一、一句话总结保证只取最后一次结果核心不是让前面的请求“不返回”而是让前面的结果“即使返回也无效”。

相关新闻

Iframe 全屏自适应: 从基础CSS到跨域动态高度的完整解决方案

Iframe 全屏自适应: 从基础CSS到跨域动态高度的完整解决方案

1. 基础CSS实现静态全屏布局要让iframe铺满整个屏幕,最基础的方法是使用CSS的定位和百分比布局。我们先从最简单的场景开始:当iframe嵌入的页面高度固定,且不需要动态调整时。假设我们有一个Vue组件需要嵌入第三方页面,基础HTML结…

2026/7/13 16:43:17 阅读更多 →
钓鱼渗透测试实验复现

钓鱼渗透测试实验复现

钓鱼渗透测试实验复现用途:网络安全学习分享,仅限授权环境测试一、实验环境角色系统/工具IP地址攻击机Windows 11(矛盾武器库)10.0.0.166靶机Windows 10 x6410.0.0.153攻击机:Windows 11 Penetration Suite Toolkit - …

2026/7/13 16:41:15 阅读更多 →
清华求真书院预科班有学生未通过考核的处理结果

清华求真书院预科班有学生未通过考核的处理结果

关于清华大学求真书院 2026 级预科班少数学生未通过考核一事,目前公开信息主要聚焦于院方的回应与后续改革方向,‌尚未公布具体的“清退”名单或详细的行政处理文件‌。 根据清华大学求真书院院长丘成桐的回应,针对该事件的处理与后续安排主要…

2026/7/13 16:39:14 阅读更多 →

最新新闻

如何快速上手NVIDIA Kimi-K2.5-Thinking-Eagle3?完整部署指南与最佳实践

如何快速上手NVIDIA Kimi-K2.5-Thinking-Eagle3?完整部署指南与最佳实践

如何快速上手NVIDIA Kimi-K2.5-Thinking-Eagle3?完整部署指南与最佳实践 【免费下载链接】Kimi-K2.5-Thinking-Eagle3 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Kimi-K2.5-Thinking-Eagle3 NVIDIA Kimi-K2.5-Thinking-Eagle3是一款基于深度优化…

2026/7/13 17:30:24 阅读更多 →
未来荧黑字体完整指南:从零开始掌握这款开源中文字体的终极教程

未来荧黑字体完整指南:从零开始掌握这款开源中文字体的终极教程

未来荧黑字体完整指南:从零开始掌握这款开源中文字体的终极教程 【免费下载链接】glow-sans SHSans-derived CJK font family with a more concise & modern look. 未来荧黑未來熒黑ヒカリ角ゴ:基于思源黑体改造,拥有粗度和宽度系列&…

2026/7/13 17:30:24 阅读更多 →
如何用GetQzonehistory找回被时间遗忘的QQ空间记忆

如何用GetQzonehistory找回被时间遗忘的QQ空间记忆

如何用GetQzonehistory找回被时间遗忘的QQ空间记忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾深夜翻看QQ空间,却发现几年前的那些说说、那些青春印记早已消失不…

2026/7/13 17:30:24 阅读更多 →
深度解析:如何通过四层架构实现QQ空间历史数据安全备份

深度解析:如何通过四层架构实现QQ空间历史数据安全备份

深度解析:如何通过四层架构实现QQ空间历史数据安全备份 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆日益重要的今天,QQ空间作为承载了亿万人青春回…

2026/7/13 17:30:24 阅读更多 →
小程序毕设选题推荐:基于微信小程序的高中信息技术智能题库测试系统的设计与实现 基于 SpringBoot 的高中信息技术课程在线考评小程序【附源码、mysql、文档、调试+代码讲解+全bao等】

小程序毕设选题推荐:基于微信小程序的高中信息技术智能题库测试系统的设计与实现 基于 SpringBoot 的高中信息技术课程在线考评小程序【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/13 17:26:23 阅读更多 →
macOS虚拟显示器终极方案:DeskPad如何彻底改变你的屏幕共享体验

macOS虚拟显示器终极方案:DeskPad如何彻底改变你的屏幕共享体验

macOS虚拟显示器终极方案:DeskPad如何彻底改变你的屏幕共享体验 【免费下载链接】DeskPad A virtual monitor for screen sharing 项目地址: https://gitcode.com/gh_mirrors/de/DeskPad 在远程协作和在线演示日益普及的今天,屏幕共享已经成为我们…

2026/7/13 17:26:23 阅读更多 →

日新闻

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:01:19 阅读更多 →
浦东旧模块回收哪家强?专业评测带你一探究竟

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

2026/7/13 0:01:19 阅读更多 →
卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

2026/7/13 0:05:20 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/13 4:38:36 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/13 4:38:38 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/13 4:38:40 阅读更多 →

月新闻