[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/DisposableStack/move [Back]  [Original]

DisposableStack : mthode move() - JavaScript | MDN

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 : mthode move()

Disponibilit limite

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

Vous voulez une meilleure prise en charge pour cette fonctionnalit ? Dites-nous pourquoi.

La mthode move() des instances de DisposableStack cre une nouvelle instance DisposableStack qui contient les mmes gestionnaires de libration que cette pile, puis marque cette pile comme libre, sans appeler aucun gestionnaire.

Dans cet article

Syntaxe

js
move()

Paramtres

Aucun.

Valeur de retour

Une nouvelle instance de DisposableStack.

Exceptions

ReferenceError

Leve si la pile est dj libre.

Description

L'objectif principal de move() est de permettre de transfrer la responsabilit de la libration hors de la porte actuelle. Par exemple, votre fonction peut prendre possession de certaines ressources et les librer en cas d'erreur ; si tout se termine avec succs, vous retournez ces ressources et transfrez la possession l'appelant.

Lorsque vous utilisez move() pour transfrer la possession, l'appel move() doit tre la toute dernire tape de votre flux de contrle, car il n'y aura aucun propritaire entre le moment o votre code abandonne la possession via move() et celui o l'appelant rcupre la possession depuis la valeur de retour.

js
let resource1;

function init() {
  using disposer = new DisposableStack();
  resource1 = disposer.use(getResource1());
  // ...
  // Abandonner la possession juste avant de retourner
  return disposer.move();
}

// Rcuprer la possession juste aprs le retour
using disposer = init();
js
let resource1;

function init() {
  using disposer = new DisposableStack();
  resource1 = disposer.use(getResource1());
  // ...
  const newDisposer = disposer.move();
  // Si quelqu'un ajoute du code entre ces lignes et qu'une erreur
  // survient, il n'y aurait aucun propritaire pour librer resource1
  return newDisposer;
}

using disposer = init();

Soyez galement prudent avec le modle suivant, mme si utiliser le  bon  modle peut tre trs contraignant dans de nombreux cas :

js
function init() {
  using disposer = new DisposableStack();
  const resource1 = disposer.use(getResource1());
  // ...
  return { disposer: disposer.move(), resource1 };
}

const { resource1, ...rest } = init();
// Si quelqu'un ajoute du code entre ces lignes et qu'une erreur
// survient, il n'y aurait aucun propritaire pour librer resource1
using disposer = rest.disposer;

move() peut aussi tre utilis pour une libration conditionnelle dans les cas o vous ne souhaitez parfois pas librer les ressources du tout. Par exemple :

js
using disposer = new DisposableStack();
const server = disposer.use(makeServer());
await server.init();
if (server.ready) {
  // Serveur initialis avec succs ; il doit maintenant vivre pendant le
  // reste du programme. Abandonner son gestionnaire et ne pas le
  // rcuprer. Il ne sera plus jamais libr.
  disposer.move();
}
// Si on atteint la fin de la porte sans excuter disposer.move(), alors
// le serveur n'est pas prt pour une raison quelconque, et on libre ses
// ressources en librant le gestionnaire.

Exemples

Prendre possession d'une pile

js
function consumeStack(stack) {
  using newStack = stack.move(); // newStack possde maintenant les gestionnaires
  console.log(stack.disposed); // true
  console.log(newStack.disposed); // false
  // newStack est libr ici juste avant la sortie de la fonction
}

const stack = new DisposableStack();
console.log(stack.disposed); // false
consumeStack(stack);
console.log(stack.disposed); // true

Permettre la libration des ressources dans deux chemins de code

Le principal cas d'utilisation de move() est lorsque vous avez une ou plusieurs ressources qui peuvent soit tre libres immdiatement, soit tre conserves pour une utilisation ultrieure. Dans ce cas, vous pouvez placer les ressources dans un DisposableStack puis appeler move() lorsque vous souhaitez les conserver pour une utilisation future.

js
class PluginHost {
  #disposed = false;
  #disposables;
  #channel;
  #socket;

  constructor() {
    // Crer un DisposableStack qui est libr en sortie du constructeur.
    // Si la construction russit, on dplace tout hors de `disposer` et
    // dans `#disposables` pour une libration ultrieure.
    using disposer = new DisposableStack();

    // Crer un adaptateur IPC autour de process.send/process.on("message").
    // Lors de la libration, il se dsabonne de process.on("message").
    this.#channel = disposer.use(new NodeProcessIpcChannelAdapter(process));

    // Crer un pseudo-websocket qui envoie et reoit des messages par
    // un canal IPC NodeJS.
    this.#socket = disposer.use(new NodePluginHostIpcSocket(this.#channel));

    // Si on arrive ici, il n'y a eu aucune erreur pendant la
    // construction et on peut dplacer les objets librables hors de
    // `disposer` et dans `#disposables`.
    this.#disposables = disposer.move();

    // Si la construction choue, alors `disposer` sera libr avant
    // d'atteindre la ligne ci-dessus. Les gestionnaires d'vnements
    // seront supprims, permettant  `#channel` et `#socket` d'tre
    // collects par le collecteur de dchets (garbage collector).
  }

  [Symbol.dispose]() {
    if (this.#disposed) {
      return;
    }
    this.#disposed = true;
    // Placer `this.#disposables` dans une variable `using`, pour qu'elle
    // soit automatiquement libre  la sortie de la fonction.
    using disposables = this.#disposables;

    // REMARQUE : on peut librer `#socket` et `#channel` ici puisqu'ils
    // seront librs par l'appel  `disposables[Symbol.dispose]()`,
    // ci-dessous.
    // Ce n'est pas strictement obligatoire pour chaque objet librable,
    // mais c'est une bonne pratique puisque ces objets ne seront plus
    // utilisables.
    this.#socket = undefined;
    this.#channel = undefined;
    this.#disposables = undefined;
  }
}

Spcifications

Spcification
ECMAScript Async Explicit Resource Management
# sec-disposablestack.prototype.move

Compatibilit des navigateurs

Voir aussi


Web Proxy Viewer  |  New URL  |  Original Page