Les promesses, introduites dans ES6, ont transformé notre approche de la programmation asynchrone. Cependant, il existe des situations dans lesquelles nous pouvons être amenés à intervenir et à annuler de force une promesse, comme dans le cas de scénarios de recherche par saisie anticipée.
Dans JavaScript moderne, la dure réalité est : non. Les promesses ne prennent actuellement pas en charge l'annulation.
L'annulation directe d'une promesse n'étant pas une option, des approches alternatives ont émergé.
Un jeton d'annulation est un mécanisme qui vous permet de transmettre une variable annulable dans une fonction. Lorsque le jeton est appelé, il abandonne l'opération et rejette la promesse associée. Voici un exemple :
function getWithCancel(url) { // token for cancellation var xhr = new XMLHttpRequest(); xhr.open("GET", url); return new Promise(function(resolve, reject) { xhr.onload = function() { resolve(xhr.responseText); }; token.cancel = function() { xhr.abort(); reject(new Error("Cancelled")); }; xhr.onerror = reject; }); }
Avec cette approche, vous pouvez :
var token = {}; var promise = getWithCancel("/someUrl", token); // later on: token.cancel();
Prometteuses, "excusez le jeu de mots", des bibliothèques comme Bluebird prennent en charge l'annulation des promesses, ainsi que d'autres fonctionnalités avancées.
Ce modèle garantit que seul le dernier appel d'une fonction s'exécute. Il utilise une approche symbolique pour annuler les invocations précédentes :
function last(fn) { var lastToken = { cancel: function(){} }; return function() { lastToken.cancel(); var args = Array.prototype.slice.call(arguments); args.push(lastToken); return fn.apply(this, args); }; }
Utilisation :
var synced = last(getWithCancel); synced("/url1?q=a"); // canceled synced("/url1?q=ab"); // canceled synced("/url1?q=abc"); // canceled synced("/url1?q=abcd").then(function() { // only this will run });
Bien qu'il soit décevant que les promesses ne prennent pas automatiquement en charge l'annulation, les techniques susmentionnées fournissent des solutions de contournement viables. À mesure que le langage évolue, la véritable annulation des promesses pourrait devenir une réalité dans le futur.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3