No. No podemos hacer eso todavía.
ES6 promesas no son compatibles con la cancelación todavía . Está en camino y su diseño es algo en lo que mucha gente trabajó muy duro. Sonido semántica de cancelación de es difícil de hacer bien y esto es un trabajo en progreso. Hay debates interesantes sobre el repositorio "fetch", sobre esdiscuss y sobre varios otros repositorios en GH, pero sería paciente si fuera usted.
Pero, pero, pero ... ¡la cancelación es realmente importante!
Es decir, la realidad del asunto es que la cancelación es realmente un escenario importante en la programación del lado del cliente. Los casos que describe como abortar solicitudes web son importantes y están en todas partes.
Entonces ... ¡el idioma me jodió!
Sí, lo siento por eso. Las promesas tenían que entrar primero antes de que se especificaran más cosas, por lo que entraron sin algunas cosas útiles como .finally
y .cancel
, sin embargo, está en camino, según las especificaciones a través del DOM. La cancelación no es una ocurrencia tardía, es solo una restricción de tiempo y un enfoque más iterativo para el diseño de API.
¿Entonces Que puedo hacer?
Tienes varias alternativas:
- Use una biblioteca de terceros como bluebird, que puede moverse mucho más rápido que la especificación y, por lo tanto, tener cancelación, así como un montón de otras ventajas, esto es lo que hacen las grandes empresas como WhatsApp.
- Pase una ficha de cancelación .
Usar una biblioteca de terceros es bastante obvio. En cuanto a un token, puede hacer que su método tome una función y luego la llame, como tal:
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;
});
};
Lo que te permitiría hacer:
var token = {};
var promise = getWithCancel("/someUrl", token);
token.cancel();
Su caso de uso real: last
Esto no es demasiado difícil con el enfoque de token:
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);
};
}
Lo que te permitiría hacer:
var synced = last(getWithCancel);
synced("/url1?q=a");
synced("/url1?q=ab");
synced("/url1?q=abc");
synced("/url1?q=abcd").then(function() {
});
Y no, las bibliotecas como Bacon y Rx no "brillan" aquí porque son bibliotecas observables, simplemente tienen la misma ventaja que tienen las bibliotecas de promesa de nivel de usuario al no estar vinculadas a especificaciones. Supongo que esperaremos y veremos en ES2016 cuando los observables se vuelvan nativos. Ellos son ingenioso para typeahead sin embargo.