logo
  • 現在做什麼
  • 關於我

Kalan

文章分類

  • 前端
  • 開發筆記
  • 雜談
  • 年度回顧

快速連結

  • 現在做什麼
  • 關於我
  • 聯絡我
  • 職涯思考🔗

關注我

在福岡生活的開發者,分享軟體開發與日本生活的點點滴滴。

© 2025 Kalan Made with ❤️. All rights reserved.

新的取消請求方式 - AbortController

由愷開愷開撰寫2019年1月21日 9:00
首頁/前端
💡

如果想問問題或單純回饋的話可以填寫表單唷

English日文

目錄

    在前端當中,我們主要可以透過兩種方式來發送請求:XHR 跟 Fetch。XHR 是從,嗯...,很久以前就有的 API。不過因為設定上很麻煩,所以時常被包裝成更高階的 API 使用,像是 jQuery 的 getJSON、axios、RxJS 的 AjaxObservable 等等。

    而近幾年隨著 Promise 逐漸流行的 Fetch API 可以大幅改進這些問題。除了回傳值為 Promise,方便操作之外,API 也相當簡單。

    不過儘管如此,還是有一項致命的缺點。Fetch 無法取消請求,雖然我們可以透過 setTimeout 的方式讓回傳值被忽略,不過請求一樣會繼續等待。在 XHR 裡頭,我們可以用 XMLHttpRequest.abort 來做取消,但 fetch 當中並沒有類似的 API。

    直到最近!終於出現了新的救星,AbortController

    The abort() method of the AbortController interface aborts a DOM request (e.g. a Fetch request) before it has completed. This is able to abort fetch requests, consumption of any response Body, and streams.

    使用方式很簡單

    const abortController = new AbortController()
    const signal = abortController.signal

    然後再將 signal 傳入 fetch 就可以了。

    fetch("/long-running", { signal: signal })

    當你呼叫 abortController.abort 時,會透過 signal 傳到 fetch 裡頭。如果接收到 signal 時請求還沒完成,這個請求就會被取消。

    fetch("/long-running", { signal: signal })
    setTimeout(() => abortController.abort(), 5000)

    如果在五秒內還沒完成請求,就會被取消。


    搭配 RxJS 包裝一下或許可以讓整個 API 更方便使用。不過目前瀏覽器的支援度還沒有很好。

    ← 和 CORS 與 cookie 打交道記一次 debug 流程 — connection refused →

    如果覺得這篇文章對你有幫助的話,可以考慮下面的連結請我喝一杯 ☕ 可以讓我平凡的一天變得閃閃發光 ✨

    ☕Buy me a coffee