DisposableStack.prototype.defer()

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

DisposableStack 例項的 defer() 方法接受一個回撥函式,該函式將在堆疊被處置時被呼叫。

語法

js
defer(onDispose)

引數

onDispose

一個在堆疊被處置時將被呼叫的函式。該函式不接收任何引數。

返回值

無(undefined)。

異常

TypeError

如果 onDispose 不是函式,則丟擲異常。

ReferenceError

如果堆疊已被處置,則丟擲異常。

描述

defer() 的主要目的是註冊一個清理回撥,該回調不特定於某個資源的處置。如果回撥特定於某個資源,您應該改用 use()adopt()。當資源不在您的程式碼中宣告時,您也可以使用 defer

js
function consumeReader(reader) {
  using disposer = new DisposableStack();
  disposer.defer(() => reader.releaseLock());
  // Do something with reader
}

示例

使用 defer()

此函式設定一個簡單的鎖,以防止多個非同步操作同時執行。當函式完成時,鎖將被釋放。

js
let isLocked = false;

async function requestWithLock(url, options) {
  if (isLocked) {
    return undefined;
  }
  using disposer = new DisposableStack();
  isLocked = true;
  disposer.defer(() => (isLocked = false));
  const data = await fetch(url, options).then((res) => res.json());
  return data;
}

規範

規範
ECMAScript 非同步顯式資源管理
# sec-asyncdisposablestack.prototype.defer

瀏覽器相容性

另見