不,我们还不能这样做。
ES6承诺不支持取消还没有。它正在进行中,其设计是很多人真正努力的工作。声音消除的语义很难正确理解,这正在进行中。关于“访存”回购,esdiscuss以及关于GH的其他几个回购,有很多有趣的辩论,但是如果我是您,请耐心等待。
但是,但是,..取消确实很重要!
事实是,取消实际上是客户端编程中的重要场景。您描述的情况(例如中止Web请求)非常重要,并且无处不在。
所以...语言把我搞砸了!
是的,对此感到抱歉。承诺必须得到在第一前进一步东西都规定-所以他们就去了,没有像一些有用的东西.finally
,并.cancel
-这是在它的途中,虽然,通过DOM规范。取消不是事后的想法,它只是时间限制,是API设计的一种更迭代的方法。
那我该怎么办?
您有几种选择:
- 使用诸如bluebird之类的第三方库,该库的运行速度比规范快得多,因此具有取消资格以及许多其他好处-这就是WhatsApp之类的大公司所做的。
- 传递取消令牌。
使用第三方库非常明显。至于令牌,您可以使方法接受一个函数,然后调用它,如下所示:
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;
});
};
这会让你做:
var token = {};
var promise = getWithCancel("/someUrl", token);
token.cancel();
您的实际用例- last
使用令牌方法并不难:
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);
};
}
这会让你做:
var synced = last(getWithCancel);
synced("/url1?q=a");
synced("/url1?q=ab");
synced("/url1?q=abc");
synced("/url1?q=abcd").then(function() {
});
不,像Bacon和Rx这样的库在这里不会“发光”,因为它们是可观察的库,它们具有与用户级别承诺的库相同的优势,因为它们不受规范的约束。我猜我们将等到可观察性技术在ES2016中出现。他们是不错的提前输入。