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

浏览器兼容性

另见