Promises, eingeführt in ES6, haben unseren Ansatz zur asynchronen Programmierung verändert. Es gibt jedoch Situationen, in denen wir möglicherweise eingreifen und ein Versprechen zwangsweise stornieren müssen, beispielsweise im Fall von Typ-Ahead-Suchszenarien.
In Modernes JavaScript, die harte Realität ist: nein. Versprechen unterstützen derzeit keine Stornierung.
Da eine direkte Stornierung von Versprechen keine Option ist, sind alternative Ansätze entstanden.
Ein Abbruchtoken ist ein Mechanismus, der es Ihnen ermöglicht, eine abbrechbare Variable an eine Funktion zu übergeben. Wenn das Token aufgerufen wird, bricht es den Vorgang ab und lehnt das zugehörige Versprechen ab. Hier ist ein Beispiel:
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; }); }
Mit diesem Ansatz können Sie:
var token = {}; var promise = getWithCancel("/someUrl", token); // later on: token.cancel();
Vielversprechend, „entschuldigen Sie das Wortspiel“, bieten Bibliotheken wie Bluebird Unterstützung für die Stornierung von Versprechen sowie andere erweiterte Funktionen.
Dieses Muster stellt sicher, dass nur der letzte Aufruf einer Funktion ausgeführt wird. Es verwendet einen Token-Ansatz, um frühere Aufrufe abzubrechen:
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); }; }
Verwendung:
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 });
Obwohl es enttäuschend ist, dass Versprechen die Stornierung nicht grundsätzlich unterstützen, bieten die oben genannten Techniken praktikable Workarounds. Während sich die Sprache weiterentwickelt, kann die tatsächliche Aufhebung von Versprechen in Zukunft Realität werden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3