Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

DisposableStack : méthode adopt()

Limited availability

Cette fonctionnalité n'est pas Compatible car elle ne fonctionne pas dans certains des navigateurs les plus utilisés.

La méthode adopt() des instances de DisposableStack enregistre une valeur qui n'implémente pas le protocole de libération dans la pile en fournissant une fonction de libération personnalisée.

Syntaxe

js
adopt(value, onDispose)

Paramètres

value

Toute valeur à enregistrer dans la pile.

onDispose

Une fonction qui sera appelée lors de la libération de la pile. La fonction reçoit value comme seul argument.

Valeur de retour

La même valeur value qui a été passée en argument.

Exceptions

TypeError

Levée si onDispose n'est pas une fonction.

ReferenceError

Levée si la pile est déjà libérée.

Description

L'objectif principal de adopt() est d'enregistrer une valeur qui n'implémente pas le protocole de libération dans la pile. Si la valeur est déjà libérable, vous pouvez utiliser use() à la place, ce qui utilise automatiquement la méthode [Symbol.dispose]() de la valeur comme fonction de libération.

adopt(value, onDispose) est presque identique à defer(() => onDispose(value)), mais elle permet de déclarer la ressource et de l'enregistrer sur la même ligne. Ainsi, il y a peu de chances qu'une erreur survienne entre la création et l'enregistrement de la ressource, ce qui pourrait entraîner une fuite de la ressource.

js
using disposer = new DisposableStack();
const reader = disposer.adopt(stream.getReader(), (reader) =>
  reader.releaseLock(),
);
js
using disposer = new DisposableStack();
const reader = stream.getReader();
// Si quelqu'un ajoute du code entre ces lignes et qu'une erreur
// survient, le flux restera verrouillé indéfiniment.
disposer.defer(() => reader.close());

Dans le même esprit de « déclarer et enregistrer la ressource dès sa création », vous devez toujours envelopper l'expression d'acquisition de la ressource dans adopt(), au lieu de l'extraire dans une instruction séparée.

js
using disposer = new DisposableStack();
const reader = stream.getReader();
disposer.adopt(reader, (reader) => reader.close());

Exemples

Utiliser la méthode adopt()

Ce code consomme un ReadableStream via un ReadableStreamDefaultReader. Le lecteur n'implémente pas le protocole de libération, donc nous utilisons adopt() pour l'enregistrer dans la pile.

js
{
  using disposer = new DisposableStack();
  const reader = disposer.adopt(stream.getReader(), (reader) =>
    reader.releaseLock(),
  );
  const { value, done } = reader.read();
  if (!done) {
    // Traiter la valeur
  }
  // La méthode reader.releaseLock() est appelée ici avant de sortir
}

Spécifications

Specification
ECMAScript Async Explicit Resource Management
# sec-asyncdisposablestack.prototype.adopt

Compatibilité des navigateurs

Voir aussi