首页 > 其他分享 >接口请求重复调用,只保留最后一个请求的返回结果

接口请求重复调用,只保留最后一个请求的返回结果

时间:2023-11-29 18:22:05浏览次数:99  
标签:axios 请求 接口 调用 error cancel currentController data

在前端开发中,有时候我们需要确保即使发起了多次相同的请求,也只处理最后一次请求的响应。这种需求在搜索输入提示、自动完成或者连续的数据更新操作中比较常见。

为了实现这个功能,我们可以使用取消之前请求的策略,或者通过标记的方式来确保只处理最后一次请求的结果。以下是使用JavaScript实现这一功能的两种方法:

fetch:使用AbortController

AbortController 是一个原生的API,可以用来取消一个或多个Web请求。这个API在现代浏览器中普遍支持。

let currentController = null;

function fetchWithAbort(url) {
  // 如果之前的请求还未完成,则取消它
  if (currentController) {
    currentController.abort();
  }

  // 创建一个新的AbortController
  currentController = new AbortController();
  const { signal } = currentController;

  // 发起请求
  fetch(url, { signal })
    .then(response => response.json())
    .then(data => {
      console.log('请求成功:', data);
      // 请求完成后,清除controller
      currentController = null;
    })
    .catch(error => {
      if (error.name === 'AbortError') {
        console.log('请求被取消:', url);
      } else {
        console.error('请求失败:', error);
      }
      // 请求失败后,清除controller
      currentController = null;
    });
}

// 使用
fetchWithAbort('api/data');
fetchWithAbort('api/data'); // 这个请求会取消上一个请求

axios:使用标记变量

在使用axios进行接口请求时,如果想要保留最后一个返回结果,可以通过取消前一个请求的方式来实现。axios提供了取消请求的功能,你可以使用CancelToken来取消请求。

以下是一个使用axios实现保留最后一个返回结果的示例代码:

import axios from 'axios';

// 创建一个变量用于存储每次请求的cancel函数
let cancel;

// 封装请求方法
function fetchApi(url, params) {
  // 检查是否存在前一个请求的cancel函数,如果存在则取消前一个请求
  if (cancel !== undefined) {
    cancel();
  }

  // 创建新的CancelToken
  const CancelToken = axios.CancelToken;
  const source = CancelToken.source();

  // 将新的cancel函数赋值给cancel变量,以便下次请求时使用
  cancel = source.cancel;

  // 发起请求
  return axios.get(url, {
    cancelToken: source.token, // 设置cancel token
    params: params
  }).then(response => {
    // 请求成功,返回数据
    return response.data;
  }).catch(error => {
    if (axios.isCancel(error)) {
      console.log('Request canceled', error.message);
    } else {
      // 处理其他错误
      console.error('Request failed', error);
    }
  });
}

// 使用封装的请求方法
fetchApi('/api/data', { query: 'example' }).then(data => {
  console.log(data);
});

在上面的代码中,每次调用fetchApi函数时,都会检查是否存在前一个请求的cancel函数,如果存在,则调用它来取消前一个请求。然后,创建一个新的CancelToken并将其传递给axios请求。这样,每次请求都只会保留最后一个返回结果,之前的请求都会被取消。

标签:axios,请求,接口,调用,error,cancel,currentController,data
From: https://www.cnblogs.com/bagexiaowenti/p/17865552.html

相关文章

  • 绑定给类的方法,对象来调用;与绑定给对象的方法,类来调用的区别
    绑定给类的方法,类来调用,对象可以调用吗?#首先创建一个类,和绑定给类的方法indexclassMyClass:@classmethoddefindex(cls):print("helloindex")实例化对象:obj=MyClass()使用对象调用绑定给类的方法:obj.index()#返回hello......
  • 秦疆的Java课程笔记:46 方法 方法的定义和调用
    Java方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:修饰符返回值类型方法名(参数类型参数名){//这一串就是方法头 …… 方法体 …… return返回值;}方法包含一个方法头和方法体。下面是一个方法的所有部分:......
  • 接口测试:接口常见bug分类
    一、接口参数数据类型:1.数值型2.字符串类型3.数组或者链表类型4.结构体二、接口测试常见bug:1.特殊值处理不当导致程序异常退出或者崩溃2.类型边界溢出,导致数据读出和写入不一致3.取值边界外值未返回正确的错误信息4.参数为null或空字符串“”等5.权限未处理,......
  • 使用axios获取接口返回二进制流进行文件下载
    1、当接口返回值类型是'application/json'时,处理报错信息1if(response.data.type&&response.data.type=='application/json'){2letreader=newFileReader();3//处理load事件。该事件在读取操作完成时触发4reader.onload=e=>......
  • jmeter发送java请求
    本文描述jmeter如何发送java请求1.编写java请求,将加密、签名等封装,对外只暴露需要传的业务参数,jemter发送java请求时直接传入业务参数即可添加依赖:12345<dependency>    <groupId>org.apache.jmeter</groupId>    <artifactId>ApacheJMeter_java</art......
  • 使用 Charles 抓取 Java 应用内 HTTP/HTTPS 请求
    代码设置OkHttpClientclient=newOkHttpClient();System.setProperty("http.proxyHost","127.0.0.1");System.setProperty("https.proxyHost","127.0.0.1");System.setProperty("http.proxyPort"......
  • “京东接口探秘:解锁电商新时代的秘密武器”
    京东接口技术贴一、概述京东接口是京东商城开放平台提供的一套API接口,开发者可以通过这些接口快速构建自己的电商应用程序,并实现与京东商城的数据交互。本文将详细介绍京东接口的使用方法、技术细节以及注意事项。二、接口地址京东接口的地址为:https://open.jd.com/home/api/doc/st......
  • identityserver4 刷新token接口返回空
    如题,查看日志发现错误信息:Nosigningcredentialforalgorithms(rs256)registered而客户端的配置里的“身份令牌算法”没有rs256于是加上就ok了。 ......
  • vue+iframe 添加请求头,自适应宽度和高度,iframe将token放在请求头不是src的url中
    1<template>2<divclass="iframe">3<iframe4v-if="isRequestHeader"5id="myIframe"6name="myIframe"7src=""8frameborder="0&qu......
  • Copy网页中F12里的请求url到postman,并且把所有参数都带过来
    F12后找到对应链接然后Copy 在PostMan中导入链接 请求一下试试 转换代码网站-多种语言可供选择https://curlconverter.com/链接: 转换代码网站 本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。作者:翎野君......