中止一个或多个 Web 请求
admin
2024-02-03 01:36:27
0

我们在处理前后端交互的过程中,有时需要仔细斟酌接口的请求时机(例:频繁的Tab切换、树节点切换、数据录入时,请求什么时候发?)或接口返回数据的处理时机(例:接口还没返回时就要切换路由,路由都切换走了,之前请求的数据怎么办?),避免一些无用的请求或者接口返回顺序的差异(例如:同一个按钮点了多次,如果后点的先返回,先点的后返回,怎么办?)。

常见的处理方式有:

加防抖:控制请求时机。对于频繁操作,只在最后一次动作时,发出请求。

锁状态:控制请求时机。直接禁止很频繁的操作,必须一个接一个。

取消请求:控制请求处理时机。取消之前没返回的请求,不再处理了。

AbortController

AbortController 接口表示一个控制器对象,允许你根据需要中止一个或多个 Web 请求。

我们先使用 AbortController() 构造函数创建一个控制器,然后使用 AbortController.signal 属性获取其关联 AbortSignal 对象的引用。

当 fetch 请求初始化时,我们将 AbortSignal 作为一个选项传递进入请求的选项对象中(下面的 {signal})。这将 signal 和 controller 与 fetch 请求相关联,并且允许我们通过调用 AbortController.abort() 去中止它。

const controller = new AbortController();fetch('/foo/bar', {signal: controller.signal
}).then(function(response) {//...
});
// 取消请求
controller.abort()

当 abort() 被调用时,这个 fetch() promise 将 reject 一个名为 AbortError 的 DOMException。

Axios

Axios 也支持以 fetch API 方式通过 AbortController 取消请求:

const controller = new AbortController();axios.get('/foo/bar', {signal: controller.signal
}).then(function(response) {//...
});
// 取消请求
controller.abort()

使用 Axios 您还可以使用 cancel token 取消一个请求。

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 {// 处理错误}
});axios.post('/user/12345', {name: 'new name'
}, {cancelToken: source.token
})// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

AJAX

AJAX 正在逐渐被 JavaScript 框架中的函数和官方的 Fetch API 标准取代。如果该请求已被发出,XMLHttpRequest.abort() 方法将终止该请求。当一个请求被终止,它的 readyState 将被置为 XMLHttpRequest.UNSENT (0),并且请求的 status 置为 0。

var xhr = new XMLHttpRequest(),method = "GET",url = "https://developer.mozilla.org/";
xhr.open(method, url, true);xhr.send();if (OH_NOES_WE_NEED_TO_CANCEL_RIGHT_NOW_OR_ELSE) {xhr.abort();
}

Axios 内部也提供了对 AbortController 的兼容处理。


const controller = new AbortController();
const signal = controller.signal
signal.addEventListener('abort', () => {console.log('事件监听器')
})const xhr = new XMLHttpRequest(),method = "GET",url = "https://developer.mozilla.org/";
xhr.open(method, url, true);xhr.send();if (signal.aborted) {console.log('请求被终止');
} else {controller.abort().xhr.abort();
}

属性 aborted一个 Boolean,表示与之通信的请求是否被终止(true)或未终止(false)。

当使用 addEventListener() 或将事件监听器分配给该接口的 onabort 属性,请求被中止时调用。

相关内容

热门资讯

女朋友快生日了我不在她身边想说... 女朋友快生日了我不在她身边想说几句浪漫点得祝福语,请各位帮忙...亲爱的,距离永远阻挡不了我对你爱,...
我18岁了,想献血,请问献血有... 我18岁了,想献血,请问献血有什么规定?无传染性疾病
即便心再痛,也愿意因为爱而停下... 即便心再痛,也愿意因为爱而停下来等待前任回头的星座有哪些?摩羯座,金牛座还有白羊座就这个星座他是非常...
第一个字是从的成语大全,从字开... 第一个字是从的成语大全,从字开头的四字词语 第一个字是从的成语大全 从容应对、 从容自若、 从天...
谁能给我紫藤萝瀑布课后练习第1... 谁能给我紫藤萝瀑布课后练习第1题的答案!自己写。原先,焦虑和悲痛“一直压在我心上”,在繁花盛开的藤萝...
冷笑话的定义是什么? 冷笑话的定义是什么?怎么样的话才算冷笑话?不好笑的笑话吧.定义1:就是讲的人挺平静的,基本上面无表情...
感觉自己失去了目标,现在不知道... 感觉自己失去了目标,现在不知道该怎么生存下去了。人生中没有一帆风顺,现成的路可走,总会遇到一些困难,...
我都24了,还没有男朋友,我真... 我都24了,还没有男朋友,我真的很慌。怎么办?身边也没有男生说喜欢我你愿意网恋吗缘分 不要宅在家里那...
我有一个朋友,我们总是出去玩,... 我有一个朋友,我们总是出去玩,喝酒。但是他每次出来都要炫耀他赚了多少钱,我觉得他很爱炫,我就不想和炫...
林永健拍过什么电视剧 林永健拍过什么电视剧金婚喜耕田的故事城里城外马文的战争
斑马s6有必要学吗 斑马s6有必要学吗有。1、激发兴趣:通过有趣的故事、游戏和其他互动活动,斑马儿童英语S6可以激发孩子...
甜蜜乐章 撮合不了子奇和慕容啊... 甜蜜乐章 撮合不了子奇和慕容啊~~~~!必须是金曲奖的最佳演唱人,不然触发不了
暮光之城3 暮光之城3现在没有出呢!有也是骗人的!起码要国内上映之后吧!我和你一样期待呢!
学生会查寝收走了东西,要用什么... 学生会查寝收走了东西,要用什么法律武器把收走的东西要回来?和学校讲法律,劝你还是别这么冲动了。拿到明...
信任无价主要讲了一个什么故事 信任无价主要讲了一个什么故事主要讲了:一位女老师通过绝食的办法,让那位偷了快译通的学生自己主动交出。
什么叫奴隶社会 什么叫奴隶社会 奴隶社会:从公元前21世纪夏朝建立开始,到公元前221年秦王嬴政统一中国结束。[1...
中级经济师人力资源专业怎么才能... 中级经济师人力资源专业怎么才能考过啊?只是看指定的那两本书《经济基础》和《人力资源管理》,然后再把上...
为什么海里都是水啊 为什么海里都是水啊海里没水 海就不叫海了不难怎么叫海水 嘿嘿。海里没水 海就不叫海了
14岁两个女生,一米深的河里手... 14岁两个女生,一米深的河里手绑手溺亡,疑点重重,怎么回事?这个是因为她们忍受不了家里面的重男轻女,...
帮解几道五年级数学题!急急急~... 帮解几道五年级数学题!急急急~快快快!(要解)52=2*2*13