Nein, das können wir noch nicht.
ES6-Versprechen unterstützen die Stornierung noch nicht . Es ist auf dem Weg und sein Design ist etwas, an dem viele Leute wirklich hart gearbeitet haben. Die Semantik der Tonunterdrückung ist schwer zu korrigieren, und dies ist noch in Arbeit. Es gibt interessante Debatten über das "Fetch" -Repo, über Esdiscuss und über mehrere andere Repos über GH, aber ich wäre nur geduldig, wenn ich Sie wäre.
Aber, aber, aber ... Stornierung ist wirklich wichtig!
Es ist die Realität, dass die Stornierung wirklich ein wichtiges Szenario bei der clientseitigen Programmierung ist. Die Fälle, die Sie als Abbruch von Webanfragen beschreiben, sind wichtig und überall.
Also ... die Sprache hat mich verarscht!
Ja, tut mir leid. Versprechen mussten erst eingehen, bevor weitere Dinge festgelegt wurden - also gingen sie ohne nützliche Dinge wie .finally
und ein .cancel
- es ist jedoch auf dem Weg zur Spezifikation durch das DOM. Die Stornierung ist kein nachträglicher Gedanke, sondern nur eine zeitliche Beschränkung und ein iterativerer Ansatz für das API-Design.
Was kann ich also tun?
Sie haben mehrere Alternativen:
- Verwenden Sie eine Drittanbieter-Bibliothek wie Bluebird , die sich viel schneller als die Spezifikation bewegen kann und daher storniert werden kann, sowie eine Reihe anderer Extras - genau das tun große Unternehmen wie WhatsApp.
- Übergeben Sie eine Löschung Token .
Die Verwendung einer Bibliothek eines Drittanbieters ist ziemlich offensichtlich. Für ein Token können Sie festlegen, dass Ihre Methode eine Funktion übernimmt und sie dann als solche aufruft:
function getWithCancel(url, token) {
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;
});
};
Welches würde Sie tun lassen:
var token = {};
var promise = getWithCancel("/someUrl", token);
token.cancel();
Ihr tatsächlicher Anwendungsfall - last
Dies ist mit dem Token-Ansatz nicht allzu schwierig:
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);
};
}
Welches würde Sie tun lassen:
var synced = last(getWithCancel);
synced("/url1?q=a");
synced("/url1?q=ab");
synced("/url1?q=abc");
synced("/url1?q=abcd").then(function() {
});
Und nein, Bibliotheken wie Bacon und Rx "glänzen" hier nicht, weil sie beobachtbare Bibliotheken sind. Sie haben nur den gleichen Vorteil, den Bibliotheken auf Benutzerebene versprechen, weil sie nicht spezifikationsgebunden sind. Ich denke, wir werden warten, um in ES2016 zu sehen, wann Observables nativ werden. Sie sind jedoch geschickt für Typeahead.