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

JS中AbortController中止請(qǐng)求操作的實(shí)現(xiàn)示例

 更新時(shí)間:2026年02月24日 09:18:54   作者:發(fā)現(xiàn)一只大呆瓜  
AbortController是JavaScript中的一個(gè)信號(hào)控制對(duì)象,用于實(shí)現(xiàn)異步操作的可控制和可中止,本文主要介紹了JS中AbortController中止請(qǐng)求操作的實(shí)現(xiàn)示例,感興趣的可以了解一下

前言

在前端開發(fā)中,我們經(jīng)常遇到需要中途撤回請(qǐng)求的情況(例如:搜索框快速輸入、大型文件上傳取消、或是 AI 聊天流的即時(shí)中斷)。傳統(tǒng)的 Promise 一旦啟動(dòng)就無法在外部“叫停”,而 AbortController 的出現(xiàn),完美填補(bǔ)了這一空白。

一、 核心概念與原理

AbortController 是 JavaScript 內(nèi)置的信號(hào)控制對(duì)象,它是實(shí)現(xiàn)異步操作可控制、可中止的核心。

1. 關(guān)鍵組成部分

  • controller.signal:一個(gè) AbortSignal 對(duì)象實(shí)例。它充當(dāng)“監(jiān)聽器”,將其傳遞給異步操作后,該操作會(huì)持續(xù)觀察信號(hào)狀態(tài)。
  • controller.abort() :觸發(fā)中止的方法。調(diào)用后,signal 上的 abort 事件會(huì)被觸發(fā),同時(shí)將 signal.aborted 設(shè)為 true。

二、 基礎(chǔ)使用模式

1. 實(shí)現(xiàn)步驟

  1. 使用 new AbortController() 生成實(shí)例。
  2. 將實(shí)例中的 signal 屬性傳遞給需要支持中止的異步 API(如 fetch)。
  3. 在合適的時(shí)機(jī)調(diào)用 controller.abort() 即可主動(dòng)終止。

2. 代碼示例

// 1. 創(chuàng)建 AbortController 實(shí)例
const controller = new AbortController();
const { signal } = controller;

// 2. 發(fā)起請(qǐng)求并綁定信號(hào)
fetch("/api/data", { signal })
  .then((response) => response.json())
  .then((data) => console.log("請(qǐng)求成功:", data))
  .catch((err) => {
    // 3. 捕獲中止錯(cuò)誤
    if (err.name === "AbortError") {
      console.log("主動(dòng)取消:請(qǐng)求被成功截?cái)?);
    } else {
      console.error("請(qǐng)求失敗:", err);
    }
  });

// 2 秒后主動(dòng)取消請(qǐng)求
setTimeout(() => {
  controller.abort(); 
}, 2000);

三、 進(jìn)階技巧與場(chǎng)景

1. 批量取消請(qǐng)求

如果想同時(shí)取消多個(gè)相關(guān)的請(qǐng)求,可以給這些請(qǐng)求共享同一個(gè) signal。當(dāng)調(diào)用 abort() 時(shí),所有關(guān)聯(lián)的任務(wù)都會(huì)收到中止信號(hào)。

2. 示例

// 使用同一個(gè) AbortController 取消多個(gè)請(qǐng)求
const controller = new AbortController();

// 請(qǐng)求1
const request1 = fetch('url1', {
  signal: controller.signal
});

// 請(qǐng)求2
const request2 = fetch('url2', {
  signal: controller.signal
});

// 請(qǐng)求3
const request3 = fetch('url3', {
  signal: controller.signal
});

// 同時(shí)取消所有請(qǐng)求
document.getElementById('cancelBtn').addEventListener('click', () => {
  controller.abort();
  console.log('所有請(qǐng)求已取消');
});

// 等待所有請(qǐng)求
Promise.all([request1, request2, request3])
  .then(responses => Promise.all(responses.map(r => r.json())))
  .then(data => console.log('所有數(shù)據(jù):', data))
  .catch(error => {
    if (error.name === 'AbortError') {
      console.log('請(qǐng)求被取消');
    }
  });

3. 注意事項(xiàng)

  • 兼容性:并非所有 API 都原生支持。目前 fetch、Axios (v0.22+) 模塊已提供支持。
  • 冪等性:abort() 方法只能生效一次。多次調(diào)用雖然不會(huì)報(bào)錯(cuò),但只有第一次調(diào)用會(huì)觸發(fā)中止邏輯。

四、 總結(jié)對(duì)比

特性傳統(tǒng) Promise帶有 AbortController 的 Promise
可控性開啟后無法干預(yù)可隨時(shí)通過 abort() 中止
異常處理只有成功/失敗增加 AbortError 類型,方便區(qū)分主動(dòng)取消與網(wǎng)絡(luò)異常
應(yīng)用場(chǎng)景簡(jiǎn)單的數(shù)據(jù)獲取復(fù)雜交互、流式輸出、性能調(diào)優(yōu)

到此這篇關(guān)于JS中AbortController中止請(qǐng)求操作的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)JS AbortController中止請(qǐng)求操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

合作市| 福鼎市| 富锦市| 宜宾县| 当涂县| 麻江县| 抚松县| 贵港市| 静宁县| 延吉市| 宜黄县| 克什克腾旗| 临澧县| 讷河市| 苍溪县| 赤城县| 东明县| 固原市| 苗栗县| 马尔康县| 天台县| 汉沽区| 长宁区| 斗六市| 呈贡县| 汽车| 百色市| 邛崃市| 游戏| 兴和县| 阿鲁科尔沁旗| 榆社县| 邮箱| 吉安市| 长顺县| 和硕县| 苏州市| 永康市| 吴桥县| 措美县| 瓮安县|