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

js中AbortController請求中止的實現(xiàn)

 更新時間:2026年01月15日 11:04:44   作者:新節(jié)  
AbortController是JavaScript中用于中止Web請求的API,主要應(yīng)用于fetch請求,也可用于其他瀏覽器API和第三方庫,下面就來介紹一下AbortController請求中止的使用,感興趣的可以了解一下

一、介紹

AbortControllerJavaScript 提供的一個強大工具,它允許開發(fā)者中止一個或多個 Web 請求。這個 API 最初是為了 fetch 請求設(shè)計的,但現(xiàn)在已經(jīng)被許多其他瀏覽器 API 和第三方庫所采用。

AbortController 的主要用途包括

  • 取消不再需要的 fetch 請求;
  • 清理長時間運行的操作;
  • 實現(xiàn)請求超時;
  • 處理組件卸載時的資源清理;

二、基本使用

2.1 創(chuàng)建 AbortController

const controller = new AbortController();
const signal = controller.signal;

2.2 與 fetch 結(jié)合使用

const controller = new AbortController();
const signal = controller.signal;

fetch("https://api.example.com/data", { signal })
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((err) => {
    if (err.name === "AbortError") {
      console.log("請求被中止");
    } else {
      console.error("請求錯誤:", err);
    }
  });

// 在需要時中止請求
controller.abort();

三、常用場景

3.1 用戶觸發(fā)的取消

const controller = new AbortController();
const fetchButton = document.getElementById("fetch-button");
const cancelButton = document.getElementById("cancel-button");

fetchButton.addEventListener("click", () => {
  fetch("https://api.example.com/data", { signal: controller.signal }).then(/* ... */).catch(/* ... */);
});

cancelButton.addEventListener("click", () => {
  controller.abort();
});

3.2 請求超時

function fetchWithTimeout(url, options, timeout = 5000) {
  const controller = new AbortController();
  const signal = controller.signal;

  // 設(shè)置超時
  const timeoutId = setTimeout(() => controller.abort(), timeout);

  return fetch(url, { ...options, signal }).finally(() => clearTimeout(timeoutId));
}

fetchWithTimeout("https://api.example.com/data", {}, 3000)
  .then(/* ... */)
  .catch((err) => {
    if (err.name === "AbortError") {
      console.log("請求超時");
    }
  });

3.3 React 組件卸載時取消請求

import { useEffect, useState } from "react";

function DataFetcher() {
  const [data, setData] = useState(null);

  useEffect(() => {
    const controller = new AbortController();

    fetch("https://api.example.com/data", { signal: controller.signal })
      .then((response) => response.json())
      .then(setData)
      .catch((err) => {
        if (err.name !== "AbortError") {
          console.error("獲取數(shù)據(jù)失敗:", err);
        }
      });

    return () => controller.abort();
  }, []);

  return <div>{data ? JSON.stringify(data) : "加載中..."}</div>;
}

3.4 并行請求的統(tǒng)一取消

const controller = new AbortController();
const signal = controller.signal;

const requests = [fetch("/api/data1", { signal }), fetch("/api/data2", { signal }), fetch("/api/data3", { signal })];

Promise.all(requests)
  .then(/* 處理所有響應(yīng) */)
  .catch((err) => {
    if (err.name === "AbortError") {
      console.log("所有請求已被取消");
    }
  });

// 取消所有請求
controller.abort();

四、高級細(xì)節(jié)

4.1 信號狀態(tài)

signal.aborted 屬性可以檢查信號是否已被中止:

const controller = new AbortController();
console.log(controller.signal.aborted); // false

controller.abort();
console.log(controller.signal.aborted); // true

4.2 事件監(jiān)聽

可以監(jiān)聽 abort 事件:

const controller = new AbortController();

controller.signal.addEventListener("abort", () => {
  console.log("請求被中止");
});

controller.abort();

4.3 重用與限制

一個 AbortController 只能中止一次,之后就不能再使用了:

const controller = new AbortController();
controller.abort();
controller.abort(); // 第二次調(diào)用不會有任何效果

如果需要多次中止操作,需要創(chuàng)建新的 AbortController 實例。

4.4 與其他 API 集成

除了 fetch,AbortController 還可以用于其他 API:

// Web APIs
const videoStream = await navigator.mediaDevices.getUserMedia({
  video: true,
  signal: controller.signal
});

// Axios
const source = axios.CancelToken.source();
axios.get("/api/data", {
  cancelToken: source.token
});
source.cancel();

4.5 自定義中止邏輯

你可以基于 AbortSignal 實現(xiàn)自己的可中止操作:

function doTask(signal) {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => resolve("任務(wù)完成"), 5000);

    signal.addEventListener("abort", () => {
      clearTimeout(timer);
      reject(new DOMException("任務(wù)被中止", "AbortError"));
    });

    if (signal.aborted) {
      clearTimeout(timer);
      reject(new DOMException("任務(wù)被中止", "AbortError"));
    }
  });
}

const controller = new AbortController();
doTask(controller.signal)
  .then(console.log)
  .catch((err) => {
    if (err.name === "AbortError") {
      console.log("任務(wù)被中止");
    }
  });

// 中止任務(wù)
controller.abort();

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

相關(guān)文章

最新評論

大同市| 崇明县| 兴城市| 汝州市| 通化县| 昌图县| 张家界市| 阿拉善盟| 垣曲县| 水城县| 台中市| 乐昌市| 凌海市| 遂昌县| 涞水县| 昌图县| 佛冈县| 深州市| 丹凤县| 高雄县| 广宁县| 竹北市| 鄂尔多斯市| 泗阳县| 萨嘎县| 池州市| 平凉市| 太谷县| 南陵县| 禹城市| 贺兰县| 重庆市| 上蔡县| 文化| 禄丰县| 松潘县| 华阴市| 阜新| 临汾市| 石泉县| 连山|