最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端終止請求的3種方式總結(jié)(ajax、axios)

 更新時(shí)間:2023年09月17日 14:51:05   作者:努力的小朱同學(xué)  
這篇文章主要給大家總結(jié)介紹了關(guān)于前端終止請求的3種方式,其中包括ajax、axios的相關(guān)資料, 取消請求在前端有時(shí)候會(huì)用到,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、原生ajax終止請求

1、abort()

XMLHttpRequest.abort() 方法用于終止 XMLHttpRequest 對象的請求,該方法沒有參數(shù),也沒有返回值。當(dāng)調(diào)用該方法時(shí),如果對應(yīng) XMLHttpRequest 對象的請求已經(jīng)被發(fā)送并且正在處理中,則會(huì)中止該請求;如果請求已經(jīng)完成(即已經(jīng)接收到完整的響應(yīng)),則不會(huì)執(zhí)行任何操作。而且調(diào)用該方法后,還會(huì)觸發(fā) XMLHttpRequest 對象的abort事件,我們可以在該事件的處理函數(shù)中執(zhí)行后續(xù)相關(guān)邏輯代碼,例如清除請求相關(guān)數(shù)據(jù)等等。

? 當(dāng)一個(gè)請求被終止后,該請求的readyState將會(huì)變?yōu)?code>0,并且status屬性也會(huì)變?yōu)?code>0。

案例代碼:

// 創(chuàng)建XMLHttpRequest對象
const xhr = new XMLHttpRequest();
// 請求地址
const url = "https://developer.mozilla.org/";
// 初始化請求
xhr.open('GET', url, true);
// 發(fā)送請求
xhr.send();
// 監(jiān)聽取消請求
xhr.addEventListener('abort', function () {
	console.log('請求被abort()取消了');
});
// 定時(shí)器模擬取消請求
setTimeout(() => {
	// 取消請求
	xhr.abort();
	// 取消請求之后的狀態(tài)status
	console.log('abort()之后的xhr.status---', xhr.status);
	// 取消請求之后的狀態(tài)readyState
	console.log('abort()之后的xhr.readyState---', xhr.readyState);
}, 100);

執(zhí)行結(jié)果:

在這里插入圖片描述

二、axios終止請求

1、AbortController(新版本)

? 在axiso0.22.0版本開始,需要使用瀏覽器原生的AbortController來終止請求,是目前推薦用的方法。當(dāng)使用該方法終止請求時(shí),如果對應(yīng)請求已經(jīng)被發(fā)送并且正在處理中,則會(huì)中止該請求;如果請求已經(jīng)完成(即已經(jīng)接收到完整的響應(yīng)),則不會(huì)執(zhí)行任何操作。

? 我們想監(jiān)聽到終止請求的操作,并進(jìn)行后續(xù)處理,有兩種方法:① 使用AbortController提供的onabort事件,通過監(jiān)聽該事件,并綁定事件處理函數(shù),在函數(shù)中進(jìn)行后續(xù)處理。② 使用try..catch,終止請求之后,會(huì)觸發(fā)catch,在catch中進(jìn)行后續(xù)處理。如果同時(shí)使用onabort事件和try..catch,則會(huì)先觸發(fā)onabort事件,再觸發(fā)try..catch。

案例代碼:

// 以vue項(xiàng)目中使用axios為例
// 創(chuàng)建請求控制器 
this.controller = new AbortController();
console.log("初始聲明的請求控制器------", this.controller);
// 第一種方法:綁定事件處理程序
this.controller.signal.addEventListener("abort", () => {
   console.log("請求已終止,觸發(fā)了onabort事件");
   // 進(jìn)行后續(xù)處理
});
// 第二種方法:try...catch
try {
    // 發(fā)送文件上傳請求
    const res = await this.$axios.post(api.Upload, uploadData, {
     timeout: 0, // 設(shè)置超時(shí)時(shí)間為 0/null 表示永不超時(shí)
     signal: this.controller.signal, // 綁定取消請求的信號量
	});
} catch (error) {
    console.log("終止請求時(shí)catch的error---", error);
    // 判斷是否為取消上傳
    if (error.message == "canceled"){
        // 進(jìn)行后續(xù)處理
    };
}
// 終止請求
this.controller.abort();
console.log("終止請求后的請求控制器------", this.controller);

執(zhí)行結(jié)果:

注意:每個(gè)AbortController可以同時(shí)取消多個(gè)請求,但是只能取消請求一次,一個(gè)AbortController在終止過請求之后,其控制是否終止請求的signal.aborted屬性會(huì)從false,變?yōu)?code>true,目前本人沒找到恢復(fù)為false的方法,暫且認(rèn)為是不可恢復(fù)的吧。如果后續(xù)請求還是綁定該請求控制器,則后續(xù)請求都會(huì)被提前終止,不會(huì)被發(fā)出。

? 如果我們想要在終止請求之后,不影響后續(xù)請求的正常發(fā)出,且后續(xù)請求也是可以被終止的,那么需要在每次發(fā)出請求之前,都通過構(gòu)造函數(shù)創(chuàng)建一個(gè)新的的 AbortController,每次請求綁定的都是新的AbortController,這樣才能做到多次請求之間不干擾。

2、CancelToken(舊版本)

? 在axiso0.22.0之前的版本,需要使用取消令牌cancel token來終止請求,不過該API從0.22.0開始被棄用,目前已不建議再使用。當(dāng)使用該方法終止請求時(shí),如果對應(yīng)請求已經(jīng)被發(fā)送并且正在處理中,則會(huì)中止該請求;如果請求已經(jīng)完成(即已經(jīng)接收到完整的響應(yīng)),則不會(huì)執(zhí)行任何操作。

? 該方法只能通過try..catch來監(jiān)聽取消請求操作,終止請求之后,會(huì)觸發(fā)catch,在catch中進(jìn)行后續(xù)處理。而且該方法在取消請求時(shí),可以通過參數(shù)自定義catcherror中的message內(nèi)容。

案例代碼:

// 以vue項(xiàng)目中使用axios為例
// 這個(gè)地方需要導(dǎo)入原生的axios 最好不要使用二次封裝后的axios
import axios from "axios";
// 創(chuàng)建請求令牌
this.source = axios.CancelToken.source();
console.log("初始聲明的請求令牌---", this.source);
// 第二種方法:try...catch
try {
    // 發(fā)送文件上傳請求
    const res = await this.$axios.post(api.Upload, uploadData, {
     timeout: 0, // 設(shè)置超時(shí)時(shí)間為 0/null 表示永不超時(shí)
     cancelToken: this.source.token, // 綁定取消請求的令牌
	});
} catch (error) {
    console.log("終止請求時(shí)catch的error---", error);
    // 判斷是否為取消上傳
    if (error.message == "自定義取消請求的message"){
        // 進(jìn)行后續(xù)處理
    };
}
// 終止請求
this.source.cancel("自定義取消請求的message");
console.log("取消請求后的請求令牌---", this.source);

執(zhí)行結(jié)果:

注意:該方法與AbortController相同,都可以同時(shí)取消多個(gè)請求,但是只能取消請求一次,一個(gè)CancelToken在終止過請求之后,如果后續(xù)請求還是綁定該請求令牌,則后續(xù)請求都會(huì)被提前終止,不會(huì)被發(fā)出。

? 同理,如果我們想要在終止請求之后,不影響后續(xù)請求的正常發(fā)出,且后續(xù)請求也是可以被終止的,那么需要在每次發(fā)出請求之前,都創(chuàng)建一個(gè)新的的 CancelToken,每次請求綁定的都是新的CancelToken,這樣才能做到多次請求之間不干擾。

三、參考資料

Axios中文文檔

AbortController

XMLHttpRequest.abort()

總結(jié)

到此這篇關(guān)于前端終止請求的3種方式的文章就介紹到這了,更多相關(guān)前端終止請求方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • bootstrap導(dǎo)航條實(shí)現(xiàn)代碼

    bootstrap導(dǎo)航條實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了bootstrap導(dǎo)航條的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • JavaScript Math.round() 方法

    JavaScript Math.round() 方法

    math.round()方法將對參數(shù)進(jìn)行四舍五入操作,對js math.round相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • JS彈出窗口的運(yùn)用與技巧大全

    JS彈出窗口的運(yùn)用與技巧大全

    本篇文章主要介紹了JS彈出窗口的運(yùn)用與技巧大全,詳解介紹了幾種利用網(wǎng)頁彈出各種形式的窗口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • JavaScript面試必考之實(shí)現(xiàn)手寫Promise

    JavaScript面試必考之實(shí)現(xiàn)手寫Promise

    Promise作為面試必考題,Promise的手寫也是面試官必問的問題,所以對于Promise我們一定要了解透徹。本文就為大家整理了手寫Promise的示例代碼,需要的可以參考一下
    2022-12-12
  • JS中setTimeout和setInterval的最大延時(shí)值詳解

    JS中setTimeout和setInterval的最大延時(shí)值詳解

    這篇文章主要介紹了JS中setTimeout和setInterval的最大延時(shí)值的相關(guān)資料,文中通過示例代碼介紹的很詳細(xì),相信對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-02-02
  • javascript不同頁面?zhèn)髦档母倪M(jìn)版

    javascript不同頁面?zhèn)髦档母倪M(jìn)版

    改進(jìn)點(diǎn):支持同頁面有多個(gè)文本框,可自動(dòng)向不同的文本框傳值。先看演示吧
    2008-09-09
  • Js判斷參數(shù)(String,Array,Object)是否為undefined或者值為空

    Js判斷參數(shù)(String,Array,Object)是否為undefined或者值為空

    在一些前端控件要提交數(shù)據(jù)到服務(wù)器端的數(shù)據(jù)驗(yàn)證過程中,需要判斷提交的數(shù)據(jù)是否為空。如果是普通表單的字符串?dāng)?shù)據(jù),只需要在 trim 后判斷 length 即可,而這里需要的數(shù)據(jù)可以是各種不同的類型,通過 JSON.stringify(data) 進(jìn)行序列化后再傳遞
    2013-11-11
  • JS拋物線動(dòng)畫實(shí)例制作

    JS拋物線動(dòng)畫實(shí)例制作

    本篇文章給大家詳細(xì)分析了JS拋物線動(dòng)畫制作過程以及相關(guān)的代碼實(shí)例分享,有興趣的朋友參考下。
    2018-02-02
  • 可以拖動(dòng)的div 實(shí)現(xiàn)代碼

    可以拖動(dòng)的div 實(shí)現(xiàn)代碼

    可以拖動(dòng)的div是一個(gè)比較難以做到的效果,特別是在瀏覽器對于js代碼的運(yùn)行效率還不是足夠高的情況下,不過聽說firefox對于js的支持正在增加,大概是料到了js在網(wǎng)頁瀏覽的桌面化趨勢中所占的重要地位吧。
    2009-06-06
  • js調(diào)試系列 控制臺命令行API使用方法

    js調(diào)試系列 控制臺命令行API使用方法

    上次初步介紹了什么是控制臺,以及簡單的 console.log 輸出信息。最后還有兩個(gè)小問題,我們就當(dāng)回顧,來看下怎么操作吧
    2014-06-06

最新評論

贺州市| 竹溪县| 荔波县| 黔西| 海晏县| 墨江| 锡林郭勒盟| 绥江县| 万全县| 宁德市| 巨野县| SHOW| 铁岭市| 永清县| 滁州市| 清流县| 鱼台县| 南充市| 东方市| 张家界市| 邵阳县| 如皋市| 乡宁县| 林芝县| 太白县| 安陆市| 乌兰察布市| 宝清县| 科技| 江安县| 夏邑县| 汉沽区| 贵德县| 博爱县| 桃园县| 万安县| 铜川市| 赣州市| 宝兴县| 历史| 江都市|