AbortController - 用于中止一个或多个 DOM 请求

这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

AbortController 接口代表一个控制器对象,允许您根据需要中止一个或多个 fetch 请求。

您可以使用 AbortController.AbortController() 构造函数创建一个新的 AbortController 对象。使用 AbortSignal 对象可以完成与 DOM 请求的通信。

构造函数

AbortController()

创建一个新的 AbortController 对象实例。

属性

AbortController.signal 只读

返回一个 AbortSignal 对象实例,该实例可用于与 DOM 请求通信 / 中止该请求。

方法

AbortController.abort()

在 DOM 请求完成之前中止它。这样可以中止 fetch 请求

实例

在以下代码段中,我们使用 Fetch API 下载视频。

我们首先使用 AbortController() 构造函数创建一个控制器,然后使用 AbortController.signal 属性获取对其关联的 AbortSignal 对象。

当启动 fetch 请求时,我们将 AbortSignal 作为选项传递到请求的选项对象中(请参见下面的 {signal})。这将信号和控制器与获取请求相关联,并允许我们通过调用 AbortController.abort() 来中止信号,如下面在第二个事件侦听器中所示。

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

var downloadBtn = document.querySelector('.download');
var abortBtn = document.querySelector('.abort');

downloadBtn.addEventListener('click', fetchVideo);

abortBtn.addEventListener('click', function() {
  controller.abort();
  console.log('下载中止');
});

function fetchVideo() {
  ...
  fetch(url, {signal}).then(function(response) {
    ...
  }).catch(function(e) {
    reports.textContent = '下载错误:' + e.message;
  })
}

注意:当调用 abort() 时,fetch() promise 将拒绝,参数是一个名为 AbortErrorDOMException

您可以在 GitHub 上找到完整的工作实例 — 请参阅 abort-api也可以在线运行)。

规范

规范 状态 备注
DOM
AbortController 的定义
现行的标准 初始定义

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持661657 不支持53

12.1

11.11

AbortController() 构造函数661657 不支持53

12.1

11.11

abort661657 不支持53

12.1

11.11

signal661657 不支持53

12.1

11.11

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持6666 未知57 未知47

12.2

11.31

AbortController() 构造函数6666 未知57 未知47

12.2

11.31

abort6666 未知57 未知47

12.2

11.31

signal6666 未知57 未知47

12.2

11.31

1. 即使定义了 window.AbortController,它也不会真正中止获取请求。参见 bug 174980

相关链接