在连续请求过程中,如何取消上次的请求?

news2024/10/6 8:25:42

前言

这个问题想必很多朋友都遇到过,我再详细说一下场景!

如 Boss 搜索框所示:

先输入1

再输入2

再输入3

再输入123 

请求参数依次为:1 12 123 123123

请求参数通过右侧的 query 参数也可以看到,一共请求了四次。

不难发现,这里已经做了基本的防抖,因为我们连续输入123的时候,只发了一次请求。

好了,现在看完基本场景,我们回到正题!

从上面的演示中不难发现我们一共发送了4次请求,顺序依次为1、12、123、123123。

面试官现在问题如下:

我先输入的 1,已经发送请求了,紧接着输入了 2,3,123,如果在我输入最后一次123的时候,我第一次输入的 1 还没有请求成功,将会导致最终 query 为 123123 的搜索结果显示为 1 的搜索结果,因为 1 最后成功的时候会将最后一次请求的结果覆盖掉,当然这个概率很小,现在就这个bug,说一下你的解决思路吧!

解决

看到这个问题我们首先应该思考的应该是如何保证后面的请求不被前面的请求覆盖掉,首先说一下防抖是不行的,防抖只是对连续输入做了处理,并不能解决这个问题,上面的演示当中应该不难发现。

如何保证后面的请求不被前面的请求覆盖掉?

我们思路是否可以转化为:我们只需要保证后面的每次接口请求都是最新的即可?

简单粗暴一点就是,我们后续请求接口时直接把前面的请求干掉即可!

那如何在后续请求时,直接干掉之前的请求?

使用 AbortController 

AbortController 接口表示一个控制器对象,允许你根据需要中止一个或多个 Web 请求。

AbortController.abort(),中止一个 尚未完成 的 Web(网络)请求。

MDN 解释如下:

AbortController - Web API 接口参考 | MDN (mozilla.org)

我们可以借助 AbortController 直接终止还 未完成 的接口请求,注意这里说的是还未完成的接口,如果已经接口请求成功就没必要终止了。

代码实现

代码如下:

let currentAbortController = null;

function fetchData(query) {
  // 取消上一次未完成的请求
  if (currentAbortController) {
    currentAbortController.abort();
  }

  // 创建新的 AbortController
  currentAbortController = new AbortController();

  return fetch(`/api/search?q=${query}`, {
    signal: currentAbortController.signal
  })
  .then(response => response.json())
  .then(data => {
    // 处理请求成功的数据
    updateDropdownList(data);
  })
  .catch(error => {
    // 只有在请求未被取消的情况下处理错误
    if (!error.name === 'AbortError') {
      handleError(error);
    }
  });
}

借用官方的解释:

当 fetch 请求初始化时,我们将 AbortSignal 作为一个选项传递进入请求的选项对象中(下面的 {signal: currentAbortController.signal})。这将 signal 和 controller 与 fetch 请求相关联,并且允许我们通过调用 AbortController.abort() 去中止它!

这就意味着我们将 signal 作为参数进行传递,当我们调用 currentRequest.abort() 时就可以终止还未完成的接口请求,从而达到我们的需要。

总结

我们再来理一下这个逻辑:

首先是第一次调用时为接口请求添加 AbortSignal 参数

之后在每次进入都判断是否存在 currentAbortController 实例,有的话直接取消掉

取消只会针对还未完成的请求,已经完成的不会取消

通过这样就可以达到我们每次都会使用最新的请求接口作为数据来源,因为后面的接口会将前面的干掉

如果这道面试题这样给面试官回答,是不是很不错?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云优惠券领取的几种方法,助你降低云服务成本

随着云计算技术的广泛应用,越来越多的企业和个人选择使用云服务来降低运营成本、提高运营效率。腾讯云作为国内领先的云服务提供商,凭借其出色的性能、稳定性和安全性,赢得了广大用户的信赖。为了回馈用户,腾讯云经常推出各种优惠…

matlab simulink 工业汽轮机调节系统的模糊PID控制器设计

1、内容简介 略 72-可以交流、咨询、答疑 工业汽轮机调节系统的模糊PID控制器设计 工业汽轮机;调节系统;模糊PID;自调整论域 2、内容说明 略 摘要:针对汽轮机电、热栽荷存在不确定因素,简单的线性和非线性微分方程不能完全代表 实际调节系统&#…

数据库国产化探究及升级改造过程指导

一、背景 在信创“自主可控”的浪潮下,政企行业首当其冲,基于国产化信创的要求,本部门某业务后端应用也需要针对分析开源组件的风险和开源协议的商业应用限制;能用国产化替代的评估后尽可替代割接,本期针对传统数据库…

2024全新快递平台系统独立版小程序源码|带cps推广营销流量主+前端

2024全新快递平台系统独立版小程序源码|带cps推广营销流量主前端程序源码 程序介绍 快递代发快递代寄寄件小程序可以对接易达云洋一级总代 快递小程序,接入云洋/易达物流接口,支持选择快递公司,三通一达,极兔,德邦等&…

DensityCalculator 程序(1D 2D):通过 VMD 可计算 LAMMPS 轨迹的密度(一)

主要内容 “在分子动力学(MD)模拟中描述原子层面的结构信息是材料建模与模拟领域研究人员的一项必要任务。密度分布的可视化通常是结构表征中最重要的特性之一。可视化分子动力学(VMD)是一种广泛使用的分子可视化软件包&#xff…

vue中如何查看组件有哪些函数与变量

在开发的过程中,经常用到他人的框架,特别是开源框架比如element,uniapp等。其中就涉及到框架里对应的组件。而组件里又有哪些内置的函数,我们通常是去查官方文档。然后很多的时候需求的多样性,要改的地方也是不一样的,…

Java------数据结构之栈与队列(简单讲解)

本篇碎碎念:时隔n个月,继续写博客,假期落下的进度,在开学后努力追赶,假期不努力,开学徒伤悲啊,此时此刻真想对自己说一句,活该啊~~~~ 欠下的链表练习题讲解会在下次更新~~~~ 今日份励…

数仓建模简介

1 建模的意义 如果把数据看作图书馆里的书,我们希望看到它们在书架上分门别类地放置;如果把数据看作城市的建筑,我们希望城市规划布局合理;如果把数据看作电脑文件和文件夹,我们希望按照自己的习惯有很好的文件夹组织方…

从政府工作报告中的IT热词统计探计算机行业发展(二)人工智能+:3次

政府工作报告作为政府工作的全面总结和未来规划,不仅反映了国家整体的发展态势,也为各行各业提供了发展的指引和参考。随着信息技术的快速发展,计算机行业已经成为推动经济社会发展的重要引擎之一。因此,从政府工作报告中探寻计算…

快递送上门,别太难为快递小哥了

新修订的《快递市场管理办法》正式落地半个月,就给快递行业来了场大热闹。 与之相关的,例如:快递新规;快递员收入减半;快递员离职潮;大把快递员离职去送外卖;上门送件快递加钱...... 简单来说&…

Sawyer 机器人 ROS SDK 配置

系列文章目录 目录 系列文章目录 前言 恢复出厂设置 内容 概述 要求 程序 将 Sawyer 升级到 Intera SDK 打印 内容 概述 先决条件 安装步骤 将机器人从 Intera MFG 切换到 SDK 模式 联网 内容 确认 Sawyer 在机器人上以 SDK 模式运行 基本 基本要求 网络…

5.多媒体

考试比重小,一般只有1道题,多则2道少则无; 主要议题: 1.多媒体概念 2.多媒体分类 分类要记下: 显示媒体又称表现媒体; 感觉媒体:着重于人的感觉器官; 表示媒体:为了存…

锦意绵长,丽彩婚典

锦江丽笙酒店亮相婚博会 演绎沪上多彩浪漫情怀 (中国上海,2024年3月18日)3月16日至17日,2024年上海春季婚博会在上海世博展览馆举办。此次婚庆行业盛会上,锦江丽笙酒店旗下8家酒店联袂登场,凭借深厚的品牌…

如何搭建DolphinScheduler服务并结合内网穿透公网远程任务调度

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问,结合内…

自己搭建代理IP池有哪些好处呢?

目录 写在前面 一、获取代理IP 二、验证代理IP 三、使用代理IP 四、定期更新代理IP 总结 写在前面 自己搭建代理IP池有很多好处。首先,使用代理IP可以绕过目标网站的访问限制,隐藏真实的IP地址,提高爬虫的稳定性和可靠性。其次&#x…

全排列的不同写法(茴字的不同写法)及对应的时间开销

资源课件&#xff1a; CS106B-recursion-pptstanford library-timer.hstanford library-set.h 不同的方法 1------ Set<string> permutations1Rec(string remaining) {Set<string> res;if(remaining.size() 0) {res "";}else {for(int i 0; i <…

django管理日志记录(日志审计django_admin_log)

环境 django 4.1 用途 django_admin_log 表主要用于以下几个方面&#xff1a; 审计日志: 可以用来记录管理界面的所有操作&#xff0c;以便审计管理员的操作。 故障排除: 可以用来诊断和排除管理界面相关的问题。 数据恢复: 可以用来恢复意外删除的数据。 from django.con…

针对教育行业的网络安全方案有哪些

智慧校园”是教育信息化进入高级阶段的表现形式&#xff0c;比“数字校园”更先进。集体知识共融、共生、业务应用融合创新、移动互联网物联网高速泛在是其重要特征。特别是在互联网教育的大环境下&#xff0c;为了更好的发挥智慧化教学服务和智慧化教学管理功能&#xff0c;需…

洋葱圈模型js实现

洋葱圈模型 什么是洋葱圈模型&#xff1f; 洋葱圈模型是一种函数执行机制&#xff0c;函数的执行想洋葱一样&#xff0c;从外圈到内圈再到外圈&#xff0c;使用过nodejs中的koa的都知道&#xff0c;在Koa框架中&#xff0c;洋葱圈模型的概念是指将中间件按照一定的顺序组织成一…

Unity 弹框选择文件、文件夹、保存文件

目录 一、概述 二、用法 1.选择文件 2.选择文件夹 3.保存文件 结束 一、概述 最近在做一个模拟仿真的项目&#xff0c;我采用了 Unity3d 发布 PC 平台来完成&#xff0c;其中有一个功能&#xff0c;需要弹框让用户选择一个 txt 文件&#xff0c;并读取 txt 文件的内容&…