用户可以通过在UI中输入值来进行异步调用。
当用户更改UI中的值时,会进行另一次异步调用 - 可能在调用提供给异步调用返回的promise的回调之前。
正在使用的异步API会返回基于 Q 的承诺。
如何正常取消原始调用,确保即使系统返回第一次调用的值,也不会使用该值调用promise的.then
部分(但最终会调用它)当第二个异步调用完成时?)
答案 0 :(得分:1)
回到那天我有一个这样的案例(node.js),我在那里做网络或数据库请求。我有一个超时对象,我认为它是可以取消的(sry,不记得细节)并对它们都有承诺。因此,如果首先返回网页,我将取消超时并返回html。如果超时发生,我更新了" timedout"某些JSON中的字段为yes,因此如果Web调用返回,它就会知道就死了。这有点令人兴奋,因为有了这些承诺,我可以进入一次功能,然后实际返回两次!
希望有所帮助
- 汤姆
答案 1 :(得分:0)
如果没有一些取消API,每个异步调用都将运行完成,但如果您要查找的只是取消.then()函数,那么这是可行的。最直接的方式是一个柜台:
var counter = 0;
function onClick() {
counter++;
doAsyncCall().then(function(result) {
if (!--counter) {
myFunc(result);
}
});
}
但是你要求优雅,所以也许更可重复使用的结构会是这样的:
var idle;
function onClick(){
idle = Overtake(idle, doAsyncCall());
idle.then(myFunc).then(myOtherFunc);
}
可以像这样实现:
function Overtaker(prior, callp) {
if (prior) {
prior.cancel();
}
var p;
p = new Promise(function(resolve, reject) {
callp.then(function(value) { return p && resolve(value); },
function(reason) { return p && reject(reason); });
});
this.cancel = function() { p = null; }
this.then = function(onFulfilled, onRejected) {
return p.then(onFulfilled, onRejected);
}
}
function Overtake(prior, p) {
return new Overtaker(prior, p);
}
我正在使用ES6承诺,但Q承诺看似相似,所以希望这也适用于那里。