首页 > 其他分享 >前端怎么去取消一个http请求

前端怎么去取消一个http请求

时间:2023-02-03 12:12:15浏览次数:54  
标签:function axios http 请求 前端 source cancel CancelToken

问题描述:

就是前端发起请求后,后端还未全部返回请求数据时,终止请求,不再返回数据。

问题案例:

【附件上传】:前端上传一个1G大小的压缩文件时,耗时大概一两分钟,在上传到50%的时候,用户要取消上传,此时,就要执行如题所探讨的终止请求动作。

解决思路:

由于目前前后端交互使用的技术有fetch/ajax/axios,那么基本思路就是基于各自提供的接口,实现请求终止动作。

【fetch】终止前端发起的请求

解决方案:使用AbortController 构造器,代码图如下:

var controller = new AbortController();
var signal = controller.signal;

var downloadBtn = document.querySelector('.download');
var abortBtn = document.querySelector('.abort');

downloadBtn.addEventListener('click', fetchVideo);

abortBtn.addEventListener('click', function() {
  controller.abort();
  console.log('Download aborted');
});

function fetchVideo() {
  ...
  fetch(url, {signal}).then(function(response) {
    ...
  }).catch(function(e) {
    reports.textContent = 'Download error: ' + e.message;
  })
}

使用说明:a.该构造器对360浏览器不兼容,使用要考虑浏览器(待普及)

【 axios】终止前端发起的请求

解决方案:利用axios请求的config参数,向axios添加一个包含cancelToken的config配置对象。
方法一代码如下:

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');

方法二代码如下:

const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // An executor function receives a cancel function as a parameter
    cancel = c;
  })
});

// cancel the request
cancel();

使用说明:a.方法一可能会终止所有的axios请求(也就是说,使用

source.cancel('Operation canceled by the user.');

后,后续的所有axios都会被终止(须自行验证))
b.使用方法二,多个用到终止请求的请求方法,可以公用一个相对全局的cancel变量,在每个请求方法有cancel=c,可以实现重置cancel。

那axios的CancelToken.source是怎么取消请求的;

实际上axios是对XMLHtpRequest的封装,axios取消请求也是运用的XMLHttpRequest.abort()来取消的.

【ajax】终止前端发起的请求

XMLHttpRequest

普通的ajax请求我们通过XMLHttpRequest.abort()方法去取消已经发出的请求, 当一个请求被终止的时候,它的readyState将被置为:XMLHttpRequest.UNSENT(0), 并且请求的status为0。

下面我们看看一个http请求怎么被取消的

let xhr = new XMLHTTPRequest(),
method = 'GET',
url = "http:aaa.com"
xhr.open( method,url,true );
xhr.send();
if(OH_NOES_WE_NEED_TO_CANCEL_RIGHT_NOW_OR_ELSE){
    xhr.abort();  //取消请求
}

 

标签:function,axios,http,请求,前端,source,cancel,CancelToken
From: https://www.cnblogs.com/Ryan-DHQ/p/17088716.html

相关文章

  • go 基于http库撸一个简易架子
    http库实现一个最简单的httpserver需要几行代码?对于python可能只需一行,对于node可能也要不了几行,那对于golang要几行?同样也要不了几行,这几乎是所有现代化高级语言......
  • #yyds干货盘点# 歌谣学前端之箭头函数1
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • http响应码
    http的状态响应码2.3.2.11:请求收到,继续处理**100——客户必须继续发出请求101——客户要求服务器根据请求转换HTTP协议版本2.3.2.22:操作成功收到,分析、接受**200——交......
  • Nginx的HTTP服务器
    Nginx的HTTP服务器一、前言有一个想法:将一些资料文件共享出去,怎么才能实现?或许可以利用Nginx搭建文件服务器。二、基于HTTP的文件服务器(Windows环境)......
  • Redis启动服务报错:服务没有及时响应启动或者控制请求
    Redis启动服务报错:服务没有及时响应启动或者控制请求,解决方案之一1、问题:在redis.conf文件修改密码之后,重启服务报错:服务没有及时响应启动或者控制请求;2、原因:redi......
  • SpringBoot发送虚拟请求~
    1、创建一个测试用的TestController@RestControllerpublicclassTestController{@GetMapping("/test")publicStringtest(){System.out.println(......
  • Fiddler抓包https
    1、fiddler下载:​​https://www.telerik.com/fiddler​​2、打开fiddler,找到tools-options3、选择https:勾选图示项4、Actions中导出证书5、在浏览器中导入证书......
  • Request-获取请求行数据-方法介绍、代码演示
    Request-获取请求行数据-方法介绍3.request功能:1.获取请求消息数1.获取请求行数据GET/day14/demo1?name=zhangsanHTTP/1.1......
  • 【博学谷学习记录】超强总结,用心分享 | 前端开发 JS基础(三)
    JavaScript基础(3)if多分支语句和switch的区别:共同点都能实现多分支选择,多选1大部分情况下可以互换区别:switch…case语句通常处理case为比较确定值的情况......
  • 前端面试需要学习的技术
    前端面试需要学习的技术HTML,CSS,JavaScript:前端的基础语言。CSS预处理器,如Sass,Less等。JavaScript框架,如React,Angular,Vue等。模块化,如CommonJS,AMD,......