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

阿里云 wordpress搭建网站西安关键词seo公司

阿里云 wordpress搭建网站,西安关键词seo公司,wordpress主题dux3.0,杭州培训网站建设XHR / Fetch / Axios 请求的取消请求与请求重试是前端性能优化与稳定性处理的重点,也是面试高频内容。下面是这三种方式的详解封装方案(可直接复用)。 ✅ 一、Axios 取消请求与请求重试封装 1. 安装依赖(可选,用于扩展…

XHR / Fetch / Axios 请求的取消请求请求重试是前端性能优化与稳定性处理的重点,也是面试高频内容。下面是这三种方式的详解封装方案(可直接复用)。


✅ 一、Axios 取消请求与请求重试封装

1. 安装依赖(可选,用于扩展)

npm install axios

2. 封装 cancelToken 与 retry 的 axios 请求模块

// axiosRequest.js
import axios from 'axios'const pendingMap = new Map()// 生成唯一 key(用于标记请求)
function getRequestKey(config) {const { method, url, params, data } = configreturn [method, url, JSON.stringify(params), JSON.stringify(data)].join('&')
}// 添加请求到 pendingMap
function addPending(config) {const key = getRequestKey(config)config.cancelToken = new axios.CancelToken(cancel => {if (!pendingMap.has(key)) {pendingMap.set(key, cancel)}})
}// 移除请求
function removePending(config) {const key = getRequestKey(config)if (pendingMap.has(key)) {const cancel = pendingMap.get(key)cancel && cancel()pendingMap.delete(key)}
}// 重试机制封装
function retryAdapterEnhancer(adapter, options = {}) {const { retries = 3, delay = 1000 } = optionsreturn async config => {let retryCount = 0const request = async () => {try {return await adapter(config)} catch (err) {if (retryCount < retries) {retryCount++await new Promise(res => setTimeout(res, delay))return request()} else {return Promise.reject(err)}}}return request()}
}// 创建实例
const axiosInstance = axios.create({timeout: 5000,adapter: retryAdapterEnhancer(axios.defaults.adapter, { retries: 2, delay: 1000 })
})// 请求拦截器
axiosInstance.interceptors.request.use(config => {removePending(config)addPending(config)return config
})// 响应拦截器
axiosInstance.interceptors.response.use(response => {removePending(response.config)return response},error => {if (axios.isCancel(error)) {console.warn('Request canceled:', error.message)}return Promise.reject(error)}
)export default axiosInstance

✅ 使用示例:

import request from './axiosRequest'request.get('/api/data', { params: { id: 1 } }).then(res => console.log(res)).catch(err => console.error(err))

✅ 二、Fetch 封装(支持取消请求 & 重试)

1. 使用 AbortController 封装取消与重试

// fetchRequest.js
export function fetchWithRetry(url, options = {}, retries = 3, delay = 1000) {const controller = new AbortController()options.signal = controller.signalconst fetchData = (retryCount = 0) => {return fetch(url, options).then(res => {if (!res.ok) throw new Error('Network response was not ok')return res}).catch(err => {if (retryCount < retries && err.name !== 'AbortError') {return new Promise(resolve =>setTimeout(() => resolve(fetchData(retryCount + 1)), delay))}throw err})}return {promise: fetchData(),cancel: () => controller.abort()}
}

✅ 使用示例:

const { promise, cancel } = fetchWithRetry('/api/data', {}, 2, 1000)promise.then(res => res.json()).then(data => console.log(data)).catch(err => console.error(err))// 调用 cancel() 可随时取消请求

✅ 三、XHR 原生封装(带取消 & 重试)

// xhrRequest.js
export function xhrWithRetry({ url, method = 'GET', data = null, retries = 3, delay = 1000 }) {let xhr = nullconst send = (retryCount = 0, resolve, reject) => {xhr = new XMLHttpRequest()xhr.open(method, url, true)xhr.onreadystatechange = () => {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {resolve(xhr.responseText)} else if (retryCount < retries) {setTimeout(() => send(retryCount + 1, resolve, reject), delay)} else {reject(new Error(`Request failed: ${xhr.status}`))}}}xhr.onerror = () => reject(new Error('Network Error'))xhr.send(data)}const promise = new Promise((resolve, reject) => send(0, resolve, reject))return {promise,cancel: () => xhr && xhr.abort()}
}

✅ 使用示例:

const { promise, cancel } = xhrWithRetry({ url: '/api/data' })promise.then(res => console.log(res)).catch(err => console.error(err))// 可随时调用取消
cancel()

✅ 总结对比

特性/方式取消支持重试支持易用性推荐场景
Axios✔️ CancelToken✔️ 自定义 adapter✅ 最佳Vue/React 项目
Fetch✔️ AbortController✔️ 手动封装✅ 清晰原生 / SSR 项目
XHR✔️ abort()✔️ 手动封装❌ 复杂老旧兼容需求

如果你想把这三套方案整合成一个通用库或 TypeScript 模块,我也可以帮你封装成统一接口版本。是否需要我继续处理这部分?

http://www.dtcms.com/wzjs/26804.html

相关文章:

  • 网站建设怎么样工作室百度资源搜索平台
  • 福州 网站开发今日西安头条最新消息
  • 中国黄页是什么seo的基本步骤包括哪些
  • 做网站要坚持怎么让百度快速收录网站
  • 中国建设银行官网站周波百度一下 你就知道首页官网
  • 海棠网站互联网营销师证书含金量
  • 怎样做销售产品网站学生网页设计模板
  • 济南做网站的机构有哪些宁波优化网站排名软件
  • 品牌网站建设美丽百度搜索量怎么查
  • 做分享网站百度推广怎么看关键词排名
  • 买个网页多少钱北京seo招聘网
  • 北京手机网站建设外包中国万网
  • 昆明做网站哪家公司好公司网站如何推广
  • 做电子手抄报的网站怎么在百度上做广告推广
  • 网站开发中定义路由的作用网址导航浏览器下载
  • 辽宁响应式网站建设哪家好营销推广策划及渠道
  • 什么网站可以做公共基础知识百度推广员工工资怎么样
  • 专门做网站的软件是seo网络优化师招聘
  • 嘉兴网站的优化百度seo插件
  • 内网穿透做网站能查到网站ip吗武汉seo招聘网
  • 推广做黄页网站比较好的友链平台
  • 东莞建外贸网站好网址收录
  • 网站建设前的规划网络营销策划公司
  • 江苏盐城建筑公司网站广点通推广登录入口
  • 90后做网站赚了爱战网关键词工具
  • 张家口做网站的公司比较靠谱的推广平台
  • 做注册任务的网站有哪些电商平台排行榜前十名
  • 建站员工网站优化推广网站seo
  • 个人网站制作wordpress个人网站怎么制作
  • 园区网站建设公司推广渠道