如何将承诺重定向到现有的延期?

时间:2016-11-11 12:34:56

标签: javascript jquery promise

我有一个返回承诺的函数。我为此创建了一个延迟的jQuery,可能会以自定义方式解析/拒绝,具体取决于实现。

一个实现使用AJAX调用,我想将重定向队列将AJAX承诺的失败/解决方案重定向到之前创建的那个。这意味着每当AJAX调用具有解析/拒绝/进度时,延迟应该使用相同的参数触发其自己的解析/拒绝/进度。

这是一些虚拟示例代码。

function Test() {
}

Test.prototype.doSomething() {
  this._deferred = $.Deferred();
  this.doSomethingImpl();
  return this._deferred;
}

var test = new Test();
test.doSomethingImpl = function() {
  var ajax = $.post(...);
  // resolve/reject/progress here the this._deferred based on the ajax promise
}

我知道我可以使用AJAX donefailprogress回调以冗长的方式执行此操作,并手动调用延迟的相应方法resolve,{ {1}}或reject),但如果有的话,我正在寻求一种单行班。

修改

这是一个与真实代码类似的代码,使用progress

knockoutjs

此代码是复杂数据网格视图模型类的片段,并且花哨的刷新解决方案用于确保刷新被限制。

1 个答案:

答案 0 :(得分:1)

是的,可以重定向分辨率(在一个完美的世界 1 ,只有deferred.resolve(promise)),但它完全没必要。当你已经在调用能够为你做出承诺的东西时,不要创建延期 - 避免使用deferred antipattern!你可以简单地return承诺:

Test.prototype.doSomething = function() {
    return this.doSomethingImpl();
};

var test = new Test();
test.doSomethingImpl = function() {
    var ajax = $.post(...);
    return ajax; // the promise
};

1)其中jQuery遵循Promises / A +规范,deferred.resolve接受thenables