取消承诺

时间:2014-08-28 19:38:37

标签: javascript promise q cancellation

用户可以通过在UI中输入值来进行异步调用。

当用户更改UI中的值时,会进行另一次异步调用 - 可能在调用提供给异步调用返回的promise的回调之前。

正在使用的异步API会返回基于 Q 的承诺。

如何正常取消原始调用,确保即使系统返回第一次调用的值,也不会使用该值调用promise的.then部分(但最终会调用它)当第二个异步调用完成时?)

2 个答案:

答案 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承诺看似相似,所以希望这也适用于那里。