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

【JS】如何给fetch添加超时功能

前言

Ajax有两种方式实现请求,分别是xhrfetch,前者有超时功能,fetch则不然。下文尝试给fetch添加超时功能。

实现

使用终止器,在controller.abort()时便会在使用其signal信号的fetch函数发送一个终止信号,请求就会被取消。

const controller = new AbortController()
fetch("https://xxx.com/aa/bb", {signal: controller.signal,
})
setTimeout(() => {console.log(controller)controller.abort()
}, 10) // 这里10毫秒过于极端可能会导致不生效,具体根据使用场景设置

在这里插入图片描述
将超时时间设为较大值,则并不阻止请求。

封装

初步封装

const request = (timeout) => {const controller = new AbortController()fetch("https://xxx.com/aa/bb", {signal: controller.signal,})setTimeout(() => {controller.abort()}, timeout)
}

但是会提高难度,明明只是要给fetch加上超时功能,现在却变成封装请求,url、配置等都需要传递,duck不必,所以封装时一定要保证fetch的功能不变,即用的时候和直接使用fetch是一样的。

参考MockJS拦截Ajax请求的做法,它获取原先的xhr,并给xhr重新赋值。

const oldXHR = XMLHttpRequest
window.XMLHttpRequest = function(){// ...new oldXHR()
}

但是也不能这么搞,这么做有侵入性,会导致所有fetch都带有超时功能。

使用高阶函数则可以避免这种情况。

function createFetch(timeout) {return (resource, options) => {let controller = new AbortController()options = options || {}options.signal = controller.signalsetTimeout(() => {controller.abort()}, timeout)return fetch(resource, options)}
}

使用没有超时功能的fetch

fetch("https://xxx.com/aa/bb")

在这里插入图片描述

使用高阶函数并传入超时时间:

createFetch(10)("https://xxx.com/aa/bb")

在这里插入图片描述

超时时间设置过长,则不会影响接口调用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【MySQL】如何优化 SQL UPDATE 语句以提升性能
  • 录制黑神话:悟空背景音,制霸你的手机铃声(游戏录制教程)
  • Codeforces Round 970 (Div. 3)
  • 什么是外卖霸王餐系统?有什么特点?
  • 怎么用golang实现一个简易版c++的FIFO队列?
  • Vue——认识day05_监视属性
  • Apifox使用学习
  • Java:正则表达式 matches
  • 如何在D盘创建虚拟环境?包括安装PyTorch和配置PyCharm
  • 服务器数据恢复—LeftHand存储中raid5阵列多块磁盘离线的数据恢复案例
  • Profinet 从站转 EtherNet/IP 从站网关
  • volatile关键字的作用
  • 爆改YOLOv8|利用yolov10的PSA注意力机制改进yolov8-高效涨点
  • C# 使用国密SM4加密解密
  • 【如何在MacOS升级ruby版本】
  • export和import的用法总结
  • Git初体验
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • passportjs 源码分析
  • PAT A1050
  • rabbitmq延迟消息示例
  • vue-router的history模式发布配置
  • webpack+react项目初体验——记录我的webpack环境配置
  • Zepto.js源码学习之二
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 浮现式设计
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 记录:CentOS7.2配置LNMP环境记录
  • 解析带emoji和链接的聊天系统消息
  • 实战|智能家居行业移动应用性能分析
  • 用Canvas画一棵二叉树
  • 鱼骨图 - 如何绘制?
  • 转载:[译] 内容加速黑科技趣谈
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​业务双活的数据切换思路设计(下)
  • !!Dom4j 学习笔记
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #AngularJS#$sce.trustAsResourceUrl
  • #vue3 实现前端下载excel文件模板功能
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #在 README.md 中生成项目目录结构
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)共用体union的用法举例
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (六)vue-router+UI组件库
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)mysql使用Navicat 导出和导入数据库
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .h头文件 .lib动态链接库文件 .dll 动态链接库