TaskSignal: any() 静态方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

注意:此功能在 Web Workers 中可用。

TaskSignal.any() 静态方法接受一个 AbortSignal 对象的可迭代对象,并返回一个 TaskSignal。当任何一个 abort 信号被中止时,返回的任务信号也会被中止。

当任务信号被中止时,其 reason 属性将被设置为导致其中止的第一个信号的原因。

语法

js
TaskSignal.any(signals)
TaskSignal.any(signals, init)

参数

signals

一个 abort 信号的 可迭代对象(例如 Array)。

init 可选

包含可选的配置参数。目前只定义了一个属性:

priority 可选

以下之一:

  • 一个 优先级 字符串,可以是 user-blockinguser-visiblebackground 之一。
  • 一个 TaskSignal

返回值

一个 TaskSignal 实例。当传递到 signals 中的第一个信号被中止时,它将被中止。当发生这种情况时

  • 它的 reason 属性将被设置为导致此信号中止的信号的原因。

  • 它的 priority 属性将由 priority 参数确定。

    • 如果 priority 参数是字符串,它将是该字符串的值。
    • 如果 priority 参数是 TaskSignal,它将是该信号的 priority 的值。

示例

使用 TaskSignal.any()

此示例演示了如何结合使用来自 TaskController 的信号和来自 TaskSignal.timeout() 的超时信号。

js
const cancelDownloadButton = document.getElementById("cancelDownloadButton");

const userCancelController = new TaskController({
  priority: "user-visible",
});

cancelDownloadButton.addEventListener("click", () => {
  userCancelController.abort();
});

// Timeout after 5 minutes
const timeoutSignal = TaskSignal.timeout(1_000 * 60 * 5);

// This signal will abort when either the user clicks the cancel button or 5 minutes is up whichever is sooner
const combinedSignal = TaskSignal.any([
  userCancelController.signal,
  timeoutSignal,
]);

try {
  const res = await fetch(someUrlToDownload, {
    // Stop the fetch when any of the
    signal: combinedSignal,
  });
  const body = await res.blob();
  // Do something with downloaded content
  // …
} catch (e) {
  if (e.name === "AbortError") {
    // Cancelled by the user
  } else if (e.name === "TimeoutError") {
    // Show user that download timed out
  } else {
    // Other error, e.g. network error
  }
}

规范

规范
优先任务调度
# dom-tasksignal-any

浏览器兼容性

另见