Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网络请求优化——取消请求

网络请求优化——取消请求

原创
作者头像
s4rn
修改于 2021-01-07 02:13:39
修改于 2021-01-07 02:13:39
2.2K0
举报
文章被收录于专栏:fe_clubfe_club

前言

我们可能会遇到这样的场景:当用户切换页面时,上个页面存在pending中的请求。积少成多,如此会造成性能浪费,增加服务器压力。本文在于分享基于小程序提供的请求api及 axios 使用中如何取消不必要的请求。

基于Promise的requestTask封装

代码语言:txt
AI代码解释
复制
// request.js

function request(opt) {
  const conf = { ... }
  
  let reqTask = null // 保存 request 返回值,并挂载到 promise 上
  const promise = new Promise((resolve, reject) => {
    reqTask = request({
      ...conf,
      success(res) {
        const { data } = res
        // ...
        return resolve(data)
      },
      fail(err) {
        return reject(err)
      },
    })
  })
  promise.reqTask = reqTask
  return promise
}

export default request
代码语言:txt
AI代码解释
复制
// api.js

import request from './request'

export function fetchData() {
  return request({ ... })
}
代码语言:txt
AI代码解释
复制
// index.js

import * as api from '../../api';

async fetchData() {
  // 一般调用
  await api.fetchData().then(response => { ... });
},

// usage
async fetchOtherData() {
  const promise = api.fetchOtherData({ ... });
  globalData['reqTask'] = promise.reqTask // 将 requestTask 挂到全局
  await promise.then(response => { ... });
},
代码语言:txt
AI代码解释
复制
<script>
export default {
  methods: {
    handleClick() {
      this.reqTask?.abort() // 取消请求
    },
  },
}
</script>

cancel token的使用

通过传递一个 executor 函数到 CancelToken 的构造函数来创建 cancel token

代码语言:txt
AI代码解释
复制
// file.js

import axios from 'axios'

uploadFile(context, files) {
  const CancelToken = axios.CancelToken

  for (let i = 0; i < files.length; i++) {
    const file = files[i]

    const promise = axios
      .post('api', data, {
        cancelToken: new CancelToken(function executor(c) {
          // executor 函数接收一个 cancel 函数作为参数
          file.cancel = c

          // 全局挂载多个 cancel token
          const cancels = []
          cancels.push(c)
          globalData['cancels'] = cancels
        }),
      })
      .then(response => { ... })
      .catch(thrown => {
        if (axios.isCancel(thrown)) console.log('Request canceled', thrown.message);
        else {
          // 处理错误
        }
      })
},
代码语言:txt
AI代码解释
复制
// index.vue

<template>
  <div>
    <div v-for="file in files" :key="file.id">
      <!-- cancel the request -->
      <div @click="file.cancel" />
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleClick() {
      // 取消多个请求
      for (let i = 0; i < this.cancels.length; i++) {
        this.cancels[i]()
      }
    },
  },
}
</script>

refs

改进异步封装:处理带返回值的异步调用

axios中文文档

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:如何中断一个网络请求?
金三银四,又快到了新的一年换工作的时候了,各种妖魔鬼怪的问题又出来了,比如 "如何根据手机壳颜色来动态改变手机主题颜色",虽然这个不是面试题,但是现在想想还是依然很好笑。
用户9078190
2022/10/28
9870
面试官:如何中断一个网络请求?
几行代码,优雅的避免接口重复请求!
throttle函数创建了一个闭包,检查当前时间与上次调用时间的差值,只有大于设定的延迟时间时才执行fetchData。
老K博客
2024/06/20
2400
几行代码,优雅的避免接口重复请求!
基于TypeScript封装Axios笔记(八)
有些场景下,我们希望能主动取消请求,比如常见的搜索框案例,在用户输入过程中,搜索框的内容也在不断变化,正常情况每次变化我们都应该向服务端发送一次请求。但是当用户输入过快的时候,我们不希望每次变化请求都发出去,通常一个解决方案是前端用 debounce 的方案,比如延时 200ms 发送请求。这样当用户连续输入的字符,只要输入间隔小于 200ms,前面输入的字符都不会发请求。
用户7572539
2020/08/26
7580
一比一还原axios源码(七)—— 取消功能
   你可以通过axios的CancelToken工厂函数,生成一个source,然后把这个对象作为参数传递给axios,最后,需要取消的时候调用source的cancel方法即可。
zaking
2022/05/10
4050
一比一还原axios源码(七)—— 取消功能
总结Vue3 的一些知识点:Vue3 Ajax(axios)
Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中。
爱学iOS的小麦子
2023/05/26
1.9K0
功能问题:如何防止接口重复请求?
防止接口重复请求在软件开发中非常重要,重复请求必然会导致服务器资源的浪费。 因为每次请求都需要服务器进行处理,如果请求是重复的,那么服务器就在做不必要的工作。在高并发的场景下,这种浪费会成倍增加,可能导致服务器性能下降,甚至引发服务崩溃。
老K博客
2024/07/03
1600
如何实现一个HTTP请求库——axios源码阅读与分析
在前端开发过程中,我们经常会遇到需要发送异步请求的情况。而使用一个功能齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率。
黄Java
2018/09/18
1.1K0
如何实现一个HTTP请求库——axios源码阅读与分析
面试官不要再问我axios了?我能手写简易版的axios
axios作为我们工作中的常用的ajax请求库,作为前端工程师的我们当然是想一探究竟,axios究竟是如何去架构整个框架,中间的拦截器、适配器、 取消请求这些都是我们经常使用的。
@超人
2021/07/29
6750
面试官不要再问我axios了?我能手写简易版的axios
【axios】使用json-server 搭建REST API
1.1 API 的分类 REST API: restful (Representational State Transfer (资源)表现层状态转化) (1) 发送请求进行CRUD 哪个操作由请求方式来决定 (2) 同一个请求路径可以进行多个操作 (3) 请求方式会用到GET/POST/PUT/DELETE 非REST API: restless (1) 请求方式不决定请求的CRUD 操作 (2) 一个请求路径只对应一个操作 (3) 一般只有GET/POST 1.2 使用json-server 搭建RES
玖柒的小窝
2021/10/05
3K0
【axios】使用json-server 搭建REST API
Axios入门与源码解析
(1) 需求: 项目中有部分接口需要的配置与另一部分接口需要的配置不太一样, 如何处理
鱼找水需要时间
2023/02/16
3K0
Axios入门与源码解析
封装 axios 取消重复请求
在我们web开发过程中,很多地方需要我们取消重复的请求。但是哪种场合需要我们取消呢?我们如何取消呢?带着这些问题我们阅读本文。
coder_koala
2021/01/06
1.7K0
【收藏干货】axios配置大全
//当实例创建时候修改配置 instance.defaults.headers.common["Authorization"] = AUTH_TOKEN; 3、 配置中的有优先级
super.x
2019/04/12
1.1K0
如何防止重复发送ajax请求
作为一个成熟的ajax应用,它应该能自己在pending过程中选择请求拦截和请求取消
coder_koala
2020/09/08
2.6K0
如何防止重复发送ajax请求
面试官:你了解Axios的原理吗?有看过它的源码吗?
实现axios.interceptors.response.use和axios.interceptors.request.use
@超人
2021/02/26
3.3K0
面试官:你了解Axios的原理吗?有看过它的源码吗?
【Web技术】920- Axios 如何取消重复请求?
在 Web 项目开发过程中,我们经常会遇到重复请求的场景,如果系统不对重复的请求进行处理,则可能会导致系统出现各种问题。比如重复的 post 请求可能会导致服务端产生两笔记录。那么重复请求是如何产生的呢?这里我们举 2 个常见的场景:
pingan8787
2021/04/07
1.6K0
【Web技术】920- Axios 如何取消重复请求?
面试官不要再问我 axios 了?我能手写简易版的 axios
作为我们工作中的常用的ajax请求库,作为前端工程师的我们当然是想一探究竟,axios究竟是如何去架构整个框架,中间的拦截器、适配器、 取消请求这些都是我们经常使用的。
winty
2021/12/15
7280
面试官不要再问我 axios 了?我能手写简易版的 axios
Axios 源码解析-完整篇
日常开发中我们经常跟接口打交道,而在现代标准前端框架(Vue/React)开发中,离不开的是 axios,出于好奇阅读了一下源码。
zz_jesse
2021/07/12
1.3K0
Axios 源码解析-完整篇
完整的Axios封装-单独API管理层、参数序列化、取消重复请求、Loading、状态码...
Axios 相信对Vue熟悉的铁汁对它不会感到陌生了(当然不熟悉Vue你也可以认识它),这简直就是前端近年来的一大杀器,自从Vue2开始之后,官方推荐使用axios来进行网络请求,后面基本大部分Vue项目都能瞧见它的身影。
玖柒的小窝
2021/10/05
4.1K2
完整的Axios封装-单独API管理层、参数序列化、取消重复请求、Loading、状态码...
【Axios】:Axios 的"请求取消"特性是什么原理?
我们在处理前后端交互的过程中,有时需要仔细斟酌接口的请求时机(例:频繁的Tab切换、树节点切换、数据录入时,请求什么时候发?)或接口返回数据的处理时机(例:接口还没返回时就要切换路由,路由都切换走了,之前请求的数据怎么办?),避免一些无用的请求或者接口返回顺序的差异(例如:同一个按钮点了多次,如果后点的先返回,先点的后返回,怎么办?)。
WEBJ2EE
2021/12/26
2.7K0
【Axios】:Axios 的"请求取消"特性是什么原理?
axios源码分析
项目连接 文档在线预览地址 axios源码分析 axios调用方法 const axios = require('axios'); // 第一种 axios({ url, method, headers, }) // 第二种 axios(url, { method, headers, }) // 第三种 axios.get(url, { headers, }) // 第四种 axios.post(url, data, { headers, }) //
念念不忘
2019/08/20
1.4K0
相关推荐
面试官:如何中断一个网络请求?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档