国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端如何中斷請(qǐng)求 ( axios、原生 ajax、fetch)

這篇具有很好參考價(jià)值的文章主要介紹了前端如何中斷請(qǐng)求 ( axios、原生 ajax、fetch)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

使用場(chǎng)景

在前端開發(fā)中,我們經(jīng)常需要中斷請(qǐng)求來優(yōu)化性能或處理特定的業(yè)務(wù)需求。以下是一些常見的使用場(chǎng)景:
比如

  1. 重復(fù)請(qǐng)求:當(dāng)頁面中多個(gè)組件并發(fā)調(diào)用同一個(gè)接口時(shí),在第一個(gè)請(qǐng)求返回后,我們可能需要中斷其他組件對(duì)該接口的調(diào)用,以避免重復(fù)請(qǐng)求和冗余數(shù)據(jù)。這在組件高度復(fù)用、不依賴公共 API 的情況下特別有用。
  2. 競(jìng)態(tài)請(qǐng)求:當(dāng)頁面定時(shí)輪詢發(fā)起請(qǐng)求時(shí),如果上一個(gè)請(qǐng)求的響應(yīng)速度比下一個(gè)請(qǐng)求慢,會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)亂。中斷較慢的請(qǐng)求可以確保只處理最新的數(shù)據(jù),避免競(jìng)態(tài)條件。
  3. 無效請(qǐng)求:在單頁應(yīng)用中,當(dāng)組件加載過慢,路由跳轉(zhuǎn)后可能會(huì)導(dǎo)致組件卸載,但請(qǐng)求仍在進(jìn)行中。如果接口返回錯(cuò)誤,錯(cuò)誤提示可能會(huì)在其他頁面彈出。中斷無效請(qǐng)求可以避免不必要的錯(cuò)誤提示。
  4. 大文件上傳暫停與恢復(fù):在實(shí)現(xiàn)大文件上傳功能時(shí),用戶可能會(huì)需要暫停和恢復(fù)上傳過程。中斷請(qǐng)求可以實(shí)現(xiàn)暫停功能,并在需要時(shí)重新發(fā)起請(qǐng)求以實(shí)現(xiàn)恢復(fù)上傳。

除了以上提到的場(chǎng)景,還有許多其他情況需要中斷請(qǐng)求以減少對(duì)服務(wù)器的無效請(qǐng)求。

下面介紹幾種終止請(qǐng)求的方案

原生ajax終止請(qǐng)求

abort() 方法

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

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

案例代碼:

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

fetch 終止請(qǐng)求

使用 AbortController 可以中斷 Fetch 請(qǐng)求。AbortController 是一個(gè)新的 Web 標(biāo)準(zhǔn),用于中止 DOM 請(qǐng)求和 Fetch 請(qǐng)求。在執(zhí)行 Fetch 請(qǐng)求時(shí),可以通過 AbortController 創(chuàng)建一個(gè)信號(hào)對(duì)象 signal,并將 signal 作為配置選項(xiàng)傳遞給 fetch() 方法,這樣就可以通過調(diào)用 AbortController 對(duì)象的 abort() 方法來中止請(qǐng)求。

案例代碼:

const controller = new AbortController();
const { signal } = controller;
// 請(qǐng)求地址
const url = "https://developer.mozilla.org/";
fetch(url, { signal })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

// 中止 fetch 請(qǐng)求
controller.abort();

axios 終止請(qǐng)求

AbortController(新版本)

從 axios 的 0.22.0 版本開始,推薦使用瀏覽器原生的 AbortController 來終止請(qǐng)求。當(dāng)使用該方法終止請(qǐng)求時(shí),如果請(qǐng)求正在處理中,則會(huì)中止該請(qǐng)求;如果請(qǐng)求已經(jīng)完成(即已經(jīng)接收到完整的響應(yīng)),則不會(huì)執(zhí)行任何操作。

我們可以通過兩種方式來監(jiān)聽終止請(qǐng)求的操作并進(jìn)行后續(xù)處理:

  • 使用 AbortController 提供的 onabort 事件,通過監(jiān)聽該事件并綁定事件處理函數(shù),在函數(shù)中執(zhí)行后續(xù)處理邏輯。
  • 使用 try…catch,終止請(qǐng)求后會(huì)觸發(fā) catch,可以在 catch 中進(jìn)行后續(xù)處理。如果同時(shí)使用 onabort 事件和 try…catch,則會(huì)先觸發(fā) onabort 事件,再觸發(fā) try…catch。

案例代碼:

// 以vue項(xiàng)目中使用axios為例
// 創(chuàng)建請(qǐng)求控制器 
this.controller = new AbortController();
console.log("初始聲明的請(qǐng)求控制器------", this.controller);

const url = "https://developer.mozilla.org/";
// 第一種方法:綁定事件處理程序
this.controller.signal.addEventListener("abort", () => {
   console.log("請(qǐng)求已終止,觸發(fā)了onabort事件");
   // 進(jìn)行后續(xù)處理
});

// 第二種方法:try...catch
try {
    // 發(fā)送文件上傳請(qǐng)求
    const res = await this.$axios.post(url, {}, {
     timeout: 0, // 設(shè)置超時(shí)時(shí)間為 0/null 表示永不超時(shí)
     signal: this.controller.signal, // 綁定取消請(qǐng)求的信號(hào)量
	});
} catch (error) {
    console.log("終止請(qǐng)求時(shí)catch的error---", error);
    // 判斷是否為取消上傳
    if (error.message == "canceled"){
        // 進(jìn)行后續(xù)處理
    };
}

// 終止請(qǐng)求
this.controller.abort();
console.log("終止請(qǐng)求后的請(qǐng)求控制器------", this.controller);

需要注意的是,每個(gè) AbortController 可以同時(shí)取消多個(gè)請(qǐng)求,但只能取消請(qǐng)求一次。終止請(qǐng)求后,該請(qǐng)求的 signal.aborted 屬性會(huì)從 false 變?yōu)?true。目前,暫無方法可以將其恢復(fù)為 false。如果后續(xù)請(qǐng)求仍然綁定了該請(qǐng)求控制器,那么后續(xù)請(qǐng)求都會(huì)被提前終止,不會(huì)被發(fā)送。

如果想要在終止請(qǐng)求后不影響后續(xù)請(qǐng)求的正常發(fā)送,并且后續(xù)請(qǐng)求也能夠被終止,需要在每次發(fā)送請(qǐng)求之前都通過構(gòu)造函數(shù)創(chuàng)建一個(gè)新的 AbortController,并將每次請(qǐng)求綁定到新的 AbortController 上,以確保多次請(qǐng)求之間不會(huì)相互干擾。

CancelToken( axios 舊版本)

在 axios 的 0.22.0 版本之前,可以使用取消令牌(CancelToken)來中止請(qǐng)求。不過,從 0.22.0 版本開始,該 API 已被棄用,不再建議使用。當(dāng)使用該方法終止請(qǐng)求時(shí),如果請(qǐng)求正在處理中,則會(huì)中止該請(qǐng)求;如果請(qǐng)求已經(jīng)完成(即已經(jīng)接收到完整的響應(yīng)),則不會(huì)執(zhí)行任何操作。

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

案例代碼:

// 以vue項(xiàng)目中使用axios為例

// 這個(gè)地方需要導(dǎo)入原生的axios 最好不要使用二次封裝后的axios
import axios from "axios";
const url = "https://developer.mozilla.org/";
// 創(chuàng)建請(qǐng)求令牌
this.source = axios.CancelToken.source();
console.log("初始聲明的請(qǐng)求令牌---", this.source);

// 第二種方法:try...catch
try {
    // 發(fā)送文件上傳請(qǐng)求
    const res = await this.$axios.post(url, {}, {
     timeout: 0, // 設(shè)置超時(shí)時(shí)間為 0/null 表示永不超時(shí)
     cancelToken: this.source.token, // 綁定取消請(qǐng)求的令牌
	});
} catch (error) {
    console.log("終止請(qǐng)求時(shí)catch的error---", error);
    // 判斷是否為取消上傳
    if (error.message == "自定義取消請(qǐng)求的message"){
        // 進(jìn)行后續(xù)處理
    };
}

// 終止請(qǐng)求
this.source.cancel("自定義取消請(qǐng)求的message");
console.log("取消請(qǐng)求后的請(qǐng)求令牌---", this.source);

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

同理,如果我們想要在終止請(qǐng)求之后,不影響后續(xù)請(qǐng)求的正常發(fā)出,且后續(xù)請(qǐng)求也是可以被終止的,那么需要在每次發(fā)出請(qǐng)求之前,都創(chuàng)建一個(gè)新的的 CancelToken,每次請(qǐng)求綁定的都是新的CancelToken,這樣才能做到多次請(qǐng)求之間不干擾。文章來源地址http://www.zghlxwxcb.cn/news/detail-758307.html

到了這里,關(guān)于前端如何中斷請(qǐng)求 ( axios、原生 ajax、fetch)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端開發(fā)中的ajax請(qǐng)求、axios封裝

    前端開發(fā)中的ajax請(qǐng)求、axios封裝

    目錄 瀏覽器http請(qǐng)求 同步?js標(biāo)簽跨域、url 異步ajax、websock協(xié)議 ajax是異步的技術(shù)術(shù)語,最早的api是xhr(XMLHttpRequest) fetch es6 api axios 封裝axios(無論用requst還是axios請(qǐng)求都會(huì)生效) src/utils/request.ts請(qǐng)求/響應(yīng)攔截器封裝 ts post請(qǐng)求request.post(url)和 通用請(qǐng)求request({url,method:\\\'post\\\'})對(duì)象

    2024年02月11日
    瀏覽(69)
  • 前端終止請(qǐng)求的三種方式(ajax、axios)

    前端終止請(qǐng)求的三種方式(ajax、axios)

    一、原生ajax終止請(qǐng)求 1、abort() ? XMLHttpRequest.abort() 方法用于終止 XMLHttpRequest 對(duì)象的請(qǐng)求,該方法沒有參數(shù),也沒有返回值。當(dāng)調(diào)用該方法時(shí),如果對(duì)應(yīng) XMLHttpRequest 對(duì)象的請(qǐng)求已經(jīng)被發(fā)送并且正在處理中,則會(huì)中止該請(qǐng)求;如果請(qǐng)求已經(jīng)完成(即已經(jīng)接收到完整的響應(yīng)),則

    2024年02月09日
    瀏覽(28)
  • axios 或 fetch 如何實(shí)現(xiàn)對(duì)發(fā)出的請(qǐng)求的終止?

    終止 HTTP 請(qǐng)求是一個(gè)重要的功能,特別是在需要優(yōu)化性能、避免不必要的請(qǐng)求或在某些事件發(fā)生時(shí)(例如用戶點(diǎn)擊取消)中斷正在進(jìn)行的請(qǐng)求時(shí)。以下是如何使用 axios 和 fetch 實(shí)現(xiàn)請(qǐng)求終止的方法: 1. axios axios 使用了 CancelToken 來支持取消請(qǐng)求。 以下是使用 axios 取消請(qǐng)求的例

    2024年02月10日
    瀏覽(20)
  • javascript常見100問|前端基礎(chǔ)知識(shí)|問ajax-fetch-axios-區(qū)別請(qǐng)用 XMLHttpRequestfetch 實(shí)現(xiàn) ajax節(jié)流和防抖px em rem vw/箭頭函數(shù)的缺點(diǎn)

    HTML CSS JS HTTP 等基礎(chǔ)知識(shí)是前端面試的第一步,基礎(chǔ)知識(shí)不過關(guān)將直接被拒。本章將通過多個(gè)面試題,講解前端常考的基礎(chǔ)知識(shí)面試題,同時(shí)復(fù)習(xí)一些重要的知識(shí)點(diǎn)。 扎實(shí)的前端基礎(chǔ)知識(shí),是作為前端工程師的根本?;A(chǔ)知識(shí)能保證最基本的使用,即招聘進(jìn)來能干活,能產(chǎn)出

    2024年04月27日
    瀏覽(33)
  • 【Ajax】如何通過axios發(fā)起Ajax請(qǐng)求

    【Ajax】如何通過axios發(fā)起Ajax請(qǐng)求

    ?? 作者簡(jiǎn)介: 前端新手學(xué)習(xí)中。 ?? 作者主頁: 作者主頁查看更多前端教學(xué) ?? 專欄分享:css重難點(diǎn)教學(xué) ? Node.js教學(xué) 從頭開始學(xué)習(xí) ? ajax學(xué)習(xí) Axios是專注于網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求的庫,相比于原生的XMLHttpRequest對(duì)象,axios簡(jiǎn)單易用。相比于Jquery,axios更加輕量化,只專注于網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)

    2024年02月02日
    瀏覽(36)
  • Ajax fetch Axios 的區(qū)別

    AJAX:一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁執(zhí)行交互技術(shù) 通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,Ajax可以使網(wǎng)頁實(shí)現(xiàn)異步更新。意味著:在不重新加載整個(gè)網(wǎng)頁 的情況下,對(duì)網(wǎng)頁某部分進(jìn)行更新。 缺點(diǎn): 針對(duì)MVC編程,不符合前端MVVM;基于原生XHR;配置和調(diào)用方式非?;靵y,基于

    2024年02月11日
    瀏覽(25)
  • ajax、axios、fetch的區(qū)別

    參考答案: ajax 是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù),并且可以做到無需重新加載整個(gè)網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁,也叫作局部更新。 使用 ajax 發(fā)送請(qǐng)求是依靠于一個(gè)對(duì)象,叫 XmlHttpRequest 對(duì)象,通過這個(gè)對(duì)象我們可以從服務(wù)器獲取到數(shù)據(jù),然后再渲染到我們

    2024年02月14日
    瀏覽(24)
  • Ajax、Fetch、Axios三者的區(qū)別

    概念:Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。是一種網(wǎng)絡(luò)請(qǐng)求的概念框架。 主要特點(diǎn):實(shí)現(xiàn)頁面局部刷新,主要使用js的XMLHttpRequest請(qǐng)求實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求。 主要缺點(diǎn):使用函數(shù)回調(diào)的方式實(shí)現(xiàn)異步請(qǐng)求,若請(qǐng)求里寫請(qǐng)求將會(huì)導(dǎo)致回調(diào)地獄的發(fā)生。 示例代碼: 概念:

    2024年04月15日
    瀏覽(23)
  • 前端異步請(qǐng)求并解決跨域問題(Ajax+axios框架)、后端響應(yīng)多個(gè)數(shù)據(jù)(JSON)

    前端異步請(qǐng)求并解決跨域問題(Ajax+axios框架)、后端響應(yīng)多個(gè)數(shù)據(jù)(JSON)

    目錄 一、前后端同步異步請(qǐng)求 1.同步請(qǐng)求: 2.異步請(qǐng)求: 3.跨域問題(前端問題) 4.axios框架(封裝后) 二、后端向前端響應(yīng)多個(gè)數(shù)據(jù)-JSON 1.同步請(qǐng)求: ? ? ? ? 發(fā)送一個(gè)請(qǐng)求,回應(yīng)請(qǐng)求,回應(yīng)的內(nèi)容會(huì)覆蓋瀏覽器中的內(nèi)容,這樣會(huì) 打斷 前端其他的正常操作。 2.異步請(qǐng)求:

    2024年02月07日
    瀏覽(32)
  • JS-27 前端數(shù)據(jù)請(qǐng)求方式;HTTP協(xié)議的解析;JavaScript XHR、Fetch的數(shù)據(jù)請(qǐng)求與響應(yīng)函數(shù);前端文件上傳XHR、Fetch;安裝瀏覽器插件FeHelper

    JS-27 前端數(shù)據(jù)請(qǐng)求方式;HTTP協(xié)議的解析;JavaScript XHR、Fetch的數(shù)據(jù)請(qǐng)求與響應(yīng)函數(shù);前端文件上傳XHR、Fetch;安裝瀏覽器插件FeHelper

    早期的網(wǎng)頁都是通過后端渲染來完成的,即服務(wù)器端渲染(SSR,server side render): 客戶端發(fā)出請(qǐng)求 - 服務(wù)端接收請(qǐng)求并返回相應(yīng)HTML文檔 - 頁面刷新,客戶端加載新的HTML文檔; 服務(wù)器端渲染的缺點(diǎn): 當(dāng)用戶點(diǎn)擊頁面中的某個(gè)按鈕向服務(wù)器發(fā)送請(qǐng)求時(shí),頁面本質(zhì)上只是一些數(shù)

    2024年02月16日
    瀏覽(42)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包