AbortSignal: phương thức tĩnh timeout()

Baseline 2024
Newly available

Since April 2024, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

Note: This feature is available in Web Workers.

Phương thức tĩnh AbortSignal.timeout() trả về một AbortSignal sẽ tự động bị hủy sau một khoảng thời gian xác định.

Tín hiệu sẽ bị hủy với một DOMException TimeoutError khi hết thời gian chờ.

Thời gian chờ được tính theo thời gian "hoạt động" thay vì thời gian trôi qua thực tế, và trên thực tế sẽ bị tạm dừng nếu mã đang chạy trong một worker bị treo hoặc khi tài liệu đang ở trong bộ nhớ đệm chuyển tiếp-lùi ("bfcache").

Để kết hợp nhiều tín hiệu, bạn có thể dùng AbortSignal.any(), ví dụ để hủy trực tiếp một lượt tải xuống bằng tín hiệu hết thời gian chờ hoặc bằng cách gọi AbortController.abort().

Cú pháp

js
AbortSignal.timeout(time)

Tham số

time

Thời gian "hoạt động", tính bằng mili giây, trước khi AbortSignal được trả về bị hủy. Giá trị phải nằm trong khoảng từ 0 đến Number.MAX_SAFE_INTEGER.

Giá trị trả về

Một AbortSignal.

Khi hết thời gian chờ, tín hiệu sẽ bị hủy và thuộc tính AbortSignal.reason của nó sẽ được đặt thành một DOMException TimeoutError, hoặc thành một DOMException AbortError nếu thao tác do người dùng kích hoạt.

Ví dụ

Dưới đây là ví dụ về một thao tác fetch sẽ hết thời gian chờ nếu không thành công sau 5 giây. Lưu ý rằng thao tác này cũng có thể thất bại nếu phương thức không được hỗ trợ, nếu người dùng nhấn nút "dừng" của trình duyệt hoặc vì một lý do khác.

js
const url = "https://path_to_large_file.mp4";

try {
  const res = await fetch(url, { signal: AbortSignal.timeout(5000) });
  const result = await res.blob();
  // …
} catch (err) {
  if (err.name === "TimeoutError") {
    // This exception is from the abort signal
    console.error("Timeout: It took more than 5 seconds to get the result!");
  } else if (err.name === "AbortError") {
    // This exception is from the fetch itself
    console.error(
      "Fetch aborted by user action (browser stop button, closing tab, etc.",
    );
  } else if (err.name === "TypeError") {
    console.error("AbortSignal.timeout() method is not supported");
  } else {
    // A network error, or some other problem.
    console.error(`Error: type: ${err.name}, message: ${err.message}`);
  }
}

Thông số kỹ thuật

Specification
DOM
# ref-for-dom-abortsignal-timeout①

Tương thích trình duyệt