场景描述
在搜索框进行输入时,在防抖处理下每次搜索都会有相关联的搜索结果进行展示,但是可能会因为网络波动等原因导致我们在发送新的请求时,上一次的请求还没有响应,可能会出现上次请求覆盖本次请求的情况,所以我们需要在发送新的请求时将上次请求取消掉。
解决方式
使用AbortController对象,它是一个控制器对象,可以根据需要中止一个或多个 Web 请求。
构造函数
let abortControllerInstance = new AbortController()
属性
AbortController.signal:返回一个 AbortSignal 对象实例,可以用它与一个 DOM 请求进行通信或者中止该请求。
方法
AbortController.abort:中止一个尚未完成的 Web(网络)请求。
代码示例
let abortControllerInstance = null;
function searchData() {
// 如果存在AbortController实例,则终止请求
if (abortControllerInstance) {
abortControllerInstance.abort();
}
abortControllerInstance = new AbortController();
fetch(`/search/data${text}`, {
// 携带signal,
signal: abortControllerInstance.signal,
})
.then((res) => {
// 请求成功处理
updateList(res);
})
.catch((err) => {
// 请求失败处理
handleError(err);
});
}