ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Axios/fatch发送哀求后取消哀求,React中使用AbortController
[打印本页]
作者:
北冰洋以北
时间:
2024-6-11 12:37
标题:
Axios/fatch发送哀求后取消哀求,React中使用AbortController
关于前端停止哀求,其实许多业务场景中,我们都用到了这个功能,之前有一次面试,问道了这个,刚好手里有个需求,由于哀求时间很长,为避免用户焦虑,于是加上一个停息哀求的功能。
正常情况下,我们使用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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4