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
adopt(value, onDispose)
Paramètres
Valeur de retour
La même valeur value qui a été passée en argument.
Exceptions
TypeError-
Levée si
onDisposen'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.
using disposer = new DisposableStack();
const reader = disposer.adopt(stream.getReader(), (reader) =>
reader.releaseLock(),
);
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.
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.
{
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
- Gestion des ressources JavaScript
- L'objet
DisposableStack - La méthode
DisposableStack.prototype.defer() - La méthode
DisposableStack.prototype.use()