关于前端停止哀求,其实许多业务场景中,我们都用到了这个功能,之前有一次面试,问道了这个,刚好手里有个需求,由于哀求时间很长,为避免用户焦虑,于是加上一个停息哀求的功能。
正常情况下,我们使用ajax/axios/fatch来发动哀求
关键代码直接看文末,照抄就对啦
1.原生AJAX的终止哀求,可以用abort(),
XMLHttpRequest.abort()方法用来终止已经发出的 HTTP 哀求。调用这个方法以后,readyState属性变为4,status属性变为0。
- var xhr = new XMLHttpRequest();
- xhr.open('GET', 'http://www.example.com/page.php', true);
- setTimeout(function () {
- if (xhr) {
- xhr.abort();
- xhr = null;
- }
- }, 5000);
复制代码 上面代码在发出5秒之后,终止一个 AJAX 哀求。
这是官网的示例代码,由于开辟过程中没有用到ajax,所以带过一下,AJAX -- JavaScript 标准参考教程(alpha)
2.axios中终止哀求,AbortController
axios的0.22版本后,需要使用浏览器原生的AbortController来终止哀求,当使用该方法终止哀求时,如果对应哀求已经被发送并且正在处置惩罚中,则会停止该哀求;如果哀求已经完成(即已经接收到完备的响应),则不会实行任何操作。
AbortController 接口表示一个控制器对象,允许你根据需要停止一个或多个 Web 哀求。
可以使用 AbortController.AbortController() 构造函数创建一个新的 AbortController。使用 AbortSignal 对象可以完成与 DOM 哀求的通讯。
AbortController.signal
返回一个 AbortSignal 对象实例,它可以用来 with/abort 一个 Web(网络)哀求。
AbortController.abort()
停止一个尚未完成的 Web(网络)哀求。这可以或许停止 fetch 哀求及任何响应体的消费和流,比如停息视频的下载等
在下面的代码片段中,我们想通过 Fetch API 下载一段视频。
我们先使用 AbortController() 构造函数创建一个控制器,然后使用 AbortController.signal 属性获取其关联 AbortSignal 对象的引用。
当 fetch 哀求初始化时,我们将 AbortSignal 作为一个选项传递进入哀求的选项对象中(下面的 {signal})。这将 signal 和 controller 与 fetch 哀求相关联,并且允许我们通过调用 AbortController.abort() 去停止它,如下面的第二个事件监听器。
- let controller;
- const url = "video.mp4";
- const downloadBtn = document.querySelector(".download");
- const abortBtn = document.querySelector(".abort");
- downloadBtn.addEventListener("click", fetchVideo);
- abortBtn.addEventListener("click", () => {
- if (controller) {
- controller.abort();
- console.log("中止下载");
- }
- });
- function fetchVideo() {
- controller = new AbortController();
- const signal = controller.signal;
- fetch(url, { signal })
- .then((response) => {
- console.log("下载完成", response);
- })
- .catch((err) => {
- console.error(`下载错误:${err.message}`);
- });
- }
复制代码 在React中,终止axios的示例Demo,我是在函数组件中实现
起首在接口中,添加config
- export const text2Img = (data,config) => {
- return Api.post('/tools/text2Img', data,config)
- }
复制代码- import React, { useState, useEffect } from 'react';
- import { text2ImgFn } from './api'
- export const App = () => {
- const [controller, setController] = useState(null)
- const getData = async () => {
- const abortController = new AbortController();
- setController(abortController);
- try {
- const res=await text2ImgFn(data,{signal:abortController.signal})
- } catch (err){
- console.log(err,'终止')
- }
- }
- const stopFn=()=>{
- controller.abort()
- }
- useEffect(() => {
- return () => {
- if (controller) {
- controller.abort();
- }
- };
- }, [])
- return (
- <div>
- <button onClick={getData}>发送</button>
- <button onClick={stopFn}>终止</button>
- </div>
- )
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |