搜索结果为什么会倒退?用请求序号处理异步响应乱序

简介: 本文讲解前端搜索中“竞态请求”问题:旧请求后返回却覆盖新结果。提出用递增序号+状态检查机制,确保仅最新请求更新UI,并附可验证的JS实现与测试说明。(239字)

米米商聊|前端学习笔记

用户先输入“项目”,接着输入“项目资料”。第二次请求先完成,页面显示了新结果;第一次请求随后返回,又把列表覆盖成旧结果。这里出错的不是排序,而是把“最后返回”误当成“当前需要”。下面用自造示例讨论这个问题,不涉及米米商聊客户端内部实现。

给一次搜索意图编号

每次搜索递增序号,只允许最新序号提交结果。检查应覆盖成功和失败:旧请求的错误提示,同样不应覆盖新请求的成功状态。清空输入也要递增,否则清空后的页面仍可能被旧结果重新填满。

load 接收字符串并返回最终结果的 Promise,publish 同步更新展示状态。为一个搜索区域保留一个实例,不要每次输入都重新创建。

export function createLatestSearch(load, publish) {
   
  let sequence = 0;
  let disposed = false;
  return {
   
    async run(query) {
   
      if (disposed) return;
      const id = ++sequence;
      const isLatest = () => !disposed && id === sequence;
      const term = query.trim();
      if (!term) {
   
        publish({
    status: 'idle', items: [] });
        return;
      }
      publish({
    status: 'loading' });
      let items;
      try {
   
        items = await load(term);
      } catch (error) {
   
        if (isLatest()) publish({
   
          status: 'error',
          message: error instanceof Error ? error.message : '请求失败'
        });
        return;
      }
      if (isLatest()) publish({
    status: 'success', items });
    },
    dispose() {
   
      disposed = true;
      ++sequence;
    }
  };
}

这个实例的 run 接收字符串。连续两次输入相同关键词,也属于两次调用,不能仅比较关键词是否相等。离开搜索区域时调用 dispose,后续完成的任务就不会再更新展示。

把检查放在最终数据之后

如果 load 内使用 fetch,应检查 response.ok,并完成正文解析后再返回数据。HTTP 错误状态不一定使 fetch 的 Promise 拒绝,response.json() 本身也异步执行;只在收到响应头时判断序号还不够。MDN:使用 Fetch

代码没有让每个请求在 finally 中统一设置“加载结束”。否则旧请求结束时,可能把仍在进行的新请求的 loading 清掉。本例用最新任务的 success 或 error 表达结束,过期任务不提交终态。Promise 的完成与失败都需要明确处理。MDN:Promise

序号与取消请求各管什么?

序号决定结果是否还有资格进入当前界面,不会停止网络传输。AbortController 可用于中止 fetch、响应体读取等操作,可以按需要配合使用,但不能把本例描述成已经实现请求取消或节省了多少带宽。MDN:abort

这也不是通用的请求处理规则。分页追加、需要全部保留的批量任务,应按自己的数据合并约定处理,不能照搬“只接受最新一次”。

本地验证覆盖什么?

本例已用可手动完成的 Promise 跑了九组 Node.js 断言:新请求先返回、旧请求先结束、旧请求失败、最新请求失败、清空输入、销毁实例、同步抛错、同关键词重复请求及空结果。全部通过,没有用随机延时碰运气。

测试只验证异步状态提交逻辑,没有调用真实搜索接口,也没有运行浏览器。接入页面后仍需检查输入事件、组件生命周期与真实错误提示。

创作说明:本文由 AI 辅助整理官方资料并起草;示例及本地断言由 AI 编写和执行。文中数据均为演示用途,不是产品性能或真机测试结论。

相关文章
|
9月前
|
JavaScript 前端开发 Apache
如何用vue-echarts实现面积图?
本文介绍如何使用 Vue-Echarts 封装面积图组件,涵盖实现效果、思路及完整代码。通过配置 `areaStyle` 实现填充区域,并支持多条数据曲线与颜色自动循环,提升开发效率。附详细代码与配置说明,适合前端开发者参考学习。
396 0
|
9月前
|
存储 人工智能 专有云
中智集团接入飞天企业版,行业云成果入选国资委AI标杆!
近日,中智集团接入阿里云飞天企业版打造的“中智行业云”成功入选国务院国资委首批“AI战略性高价值场景”。同时,该成果凭借先进的技术架构与场景赋能价值,还获评中国信息通信研究院“面向AI的智能化专有云底座”创新应用实践,成为AI与云计算在人力资源领域的标杆应用。
622 0
|
6月前
|
人工智能 架构师 Apache
相约深圳,全球征集|Flink Forward Asia 2026 演讲议题征集正式启动
Flink Forward Asia 2026将于6月26–27日首次落地深圳,聚焦实时计算与AI深度融合。面向全球征集议题(截止5月29日),涵盖实时AI、AI Agent、湖流一体等前沿方向。免费报名开启,共探下一代实时计算范式!
1112 4
相约深圳,全球征集|Flink Forward Asia 2026 演讲议题征集正式启动
|
人工智能 机器人 新能源
深化新工科建设 共探智能新未来 | 阿里云支持南京大学苏州校区“AI DAY”盛大启幕丨云工开物
9月12日,南京大学苏州校区举办“AI新视界:深化新工科建设进行式”活动,采用教师与学生双专场模式,通过主题分享、实践演练、产业课题发布等形式,搭建产教融合AI交流平台,助力未来产业科技人才培养。
|
存储 机器学习/深度学习 数据库
阿里云服务器X86/ARM/GPU/裸金属/超算五大架构技术特点、场景适配参考
在云计算技术飞速发展的当下,云计算已经渗透到各个行业,成为企业数字化转型的关键驱动力。选择合适的云服务器架构对于提升业务效率、降低成本至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供大家了解和选择参考。
1800 61
|
人工智能 开发框架 自然语言处理
企业级AI搜索解决方案:阿里云AI搜索开放平台
本文介绍了 阿里云 AI 搜索开放平台作提供丰富的 AI 搜索组件化服务,兼容主流开发框架 LangChain和 LlamaIndex,支持搜索专属大模型、百炼等大模型服务,以及 Elasticsearch、Havenask 等开源引擎。用户可灵活调用多模态数据解析、大语言模型、效果测评等数十个服务,实现智能搜索、检索增强生成(RAG)、多模态搜索等场景的搭建。
1553 0
|
11月前
|
人工智能 决策智能
清华大学“Al+经管 零基础玩转大模型”AI Day举办成功丨云工开物
2025年11月13日,清华经管学院CDC联合阿里云举办“AI+经管”AI day,百余名学生参与。活动通过“讲座+实践”形式,聚焦大模型在经管领域的应用,涵盖金融智能体、多智能体协同、零代码数据看板等实战内容,助力学生掌握AI技能,推动AI与专业融合,提升数智时代竞争力。
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
1240 90
|
SQL 分布式计算 DataWorks
使用DataWorks PyODPS节点调用XGBoost算法
本文介绍如何在DataWorks中通过PyODPS3节点调用XGBoost算法完成模型训练与测试,并实现周期离线调度。主要内容包括:1) 使用ODPS SQL构建数据集;2) 创建PyODPS3节点进行数据处理与模型训练;3) 构建支持XGBoost的自定义镜像;4) 测试运行并选择对应镜像。适用于需要集成机器学习算法到大数据工作流的用户。
753 24