当前位置: 首页 > 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")

在这里插入图片描述

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


http://www.mrgr.cn/news/19687.html

相关文章:

  • 什么是控制系统
  • 如何免费制作一个新生资料收集系统?
  • 如何修复软件中的BUG
  • 浅谈人工智能与大模型
  • 使用3DUNet训练自己的数据集(pytorch)-医疗影像分割
  • 秋招突击——算法练习——8/30、9/4——技巧题练习——复习{}——新作{只出现一次的数字、多数元素、颜色分类、下一个排列、寻找重复数}
  • 性能优化:提升MySQL数据备份策略的效率
  • kubeadm方式安装k8s
  • 惠中科技:引领光伏清洗新时代——RDS环保光伏清洗剂的创新应用
  • xhr、ajax、axois、fetch的区别
  • Amazon QuickSight 实验
  • 浅谈DevOps在inBuilder低代码中的应用
  • 大模型学习路线:从新手到专家的全面指南,从零基础到精通,非常详细收藏我这一篇就够了
  • Pyecharts 数据可视化大屏:创建引人注目的数据展示
  • 【JUC】11-volatile关键字
  • 步进、闭环、交流伺服三类电机驱动方案对比
  • springboot-es(elasticsearch)搜索项目
  • Elasticsearch设置密码报错:ERROR: X-Pack Security is disabled by configuration.
  • 汽车电子行业知识:关于车载中控屏
  • 深度学习--机器学习相关(2)