网站首页 > 技术文章 正文
前几天系统又爆出一个问题,有个页面数据迟迟没有响应,系统就一直在转圈圈,用户体验极差,于是就找到前端同学得赶紧解决这个问题,这体验,用户不得跑完了?于是今天这篇文章总结了下在前端开发中,如果发出的请求在一定时间内没响应,取消该请求是一个很好的实践,可以避免不必要的资源浪费和潜在的内存泄漏。
应用场景
假设你正在开发一个电商平台的搜索功能,用户在搜索框输入关键词后,前端会发送一个请求到后端获取搜索结果。如果用户在等待搜索结果的过程中又输入了新的关键词,那么之前的请求就可能变得不再需要。为了避免这种情况,可以在用户输入新关键词时取消之前的请求。
示例代码
以下示例使用 axios 库来发送请求,并使用 AbortController(对于使用原生 fetch API)或 axios 的取消功能来取消请求:
使用 axios 取消请求
// 创建一个 axios 实例
const axiosInstance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000 // 设置请求超时时间为 10 秒
});
// 定义一个变量来存储取消函数
let cancelTokenSource;
// 发起请求的函数
function fetchData(keyword) {
  // 如果之前有未完成的请求,先取消
  if (cancelTokenSource) {
    cancelTokenSource.cancel('Cancelled by new request');
  }
  // 创建新的取消 token
  cancelTokenSource = axios.CancelToken.source();
  axiosInstance.get('/search', {
    params: { keyword },
    cancelToken: cancelTokenSource.token
  })
  .then(response => {
    console.log('Search results:', response.data);
  })
  .catch(error => {
    if (axios.isCancel(error)) {
      console.log('Request canceled', error.message);
    } else {
      console.error('Error fetching data:', error);
    }
  });
}
// 模拟用户输入关键词
fetchData('initial keyword');
// 模拟用户在 5 秒后输入新的关键词
setTimeout(() => {
  fetchData('new keyword');
}, 5000);
在这个示例中,每次调用 fetchData 函数时,都会先检查是否有未完成的请求,如果有,则取消之前的请求。然后创建一个新的取消 token 并发起新的请求。
使用原生 fetch API 取消请求
// 定义一个变量来存储 AbortController 实例
let controller;
// 发起请求的函数
function fetchData(keyword) {
  // 如果之前有未完成的请求,先取消
  if (controller) {
    controller.abort();
  }
  // 创建新的 AbortController 实例
  controller = new AbortController();
  const signal = controller.signal;
  fetch('https://api.example.com/search', {
    method: 'GET',
    signal,
    params: { keyword }
  })
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => {
    console.log('Search results:', data);
  })
  .catch(error => {
    if (error.name === 'AbortError') {
      console.log('Request canceled');
    } else {
      console.error('Error fetching data:', error);
    }
  });
}
// 模拟用户输入关键词
fetchData('initial keyword');
// 模拟用户在 5 秒后输入新的关键词
setTimeout(() => {
  fetchData('new keyword');
}, 5000);
在这个示例中,使用 AbortController 的 abort 方法来取消之前的请求。当用户输入新的关键词时,会先取消之前的请求,然后发起新的请求。
创作不易,如果这篇文章对你有用,欢迎点赞关注加评论哦
小伙伴们在工作中还遇到过其他应用场景吗,欢迎评论区留言讨论哦。
猜你喜欢
- 2025-01-23 前端中的 == 和 === 运算符有什么区别
- 2025-01-23 电路中三极管,大小不一,形状各异,到底有什么不同?
- 2025-01-23 前端开发中20条不可忽视的知识点汇总!总有你能get到的
欢迎 你 发表评论:
- 最近发表
- 
- 哪里有好看实用的ppt模板下?优质ppt模板下载渠道
- 开发者必备:10款最佳JavaScript模板引擎
- 中文网址导航模版HaoWa1.3.1/模版网站wordpress导航主题
- 哪里有免费下载的简历模板?_哪里有免费简历可以下载
- 6 款超棒的响应式网站设计模板推荐
- 简约时尚作品博客商店网站HTML5模板源码
- 界面控件DevExpress WinForms v21.2:Data Grid - 全新的HTML模板
- 《nginx 实战:前端项目一键部署指南》
- QT软件开发真的适合做高端网站吗?用户体验设计公司的实战
- 【GitHub每日速递】前端组件库shadcn/ui与AI研究神器SurfSense
 
- 标签列表
- 
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
 

本文暂时没有评论,来添加一个吧(●'◡'●)