| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/DisposableStack/move | [Back] [Original] |
Get to know MDN better
Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.
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.
move()
Aucun.
Une nouvelle instance de DisposableStack.
ReferenceErrorLeve si la pile est dj libre.
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.
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();
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 :
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 :
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.
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
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.
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;
}
}
| Spcification |
|---|
| ECMAScript Async Explicit Resource Management # sec-disposablestack.prototype.move |
DisposableStackDisposableStack.prototype.dispose()Cette page a t modifie le 21 fvr. 2026 par les contributeurices du MDN.
DisposableStackObject/FunctionObject.prototype.__defineGetter__()Object.prototype.__defineSetter__()Object.prototype.__lookupGetter__()Object.prototype.__lookupSetter__()Object.prototype.hasOwnProperty()Object.prototype.isPrototypeOf()Object.prototype.propertyIsEnumerable()Object.prototype.toLocaleString()Object.prototype.toString()Object.prototype.valueOf()Certaines parties de ce contenu sont protges par le droit d'auteur 19982026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.
| Web Proxy Viewer | New URL | Original Page |