【问题标题】:Delegating jquery Deferred to another Deferred将 jquery Deferred 委托给另一个 Deferred
【发布时间】:2014-10-12 22:57:49
【问题描述】:

我正在尝试链接 jquery deferred,以便一个 promise 由另一个 Deferred 解决。

我的用例是:我有一个向客户返回承诺的对象,

var p1 = $.Deferred();

// client gets a promise for a future result
function get() {
    return p1.promise();    
}

在未来的某个时间,其他东西会提供 p1 最终应该解析为值或另一个承诺的结果:

// at some time in the future, something else completes p1 with either a value:
function resolveWithValue(val) {
    p1.resolve(val);
}

// .. or with a promise
function resolveWithPromise(promise) {
    // ... in which case we want p1 to resolve/reject/wait based on the promise arg:

    // 1st try - doesn't work - p1.done() yields a promise, not the promise's value;
    p1.resolve(promise);

    // 2nd try - this works, but-- is there a better syntax?
    promise
        .done(function(v) { p1.resolve(v); })
        .fail(function() { p1.reject(); });
}

我的问题是,最后一行(“第二次尝试”)是否有更好的语法?我相信其他承诺库允许像“第一次尝试”那样进行链接,但我需要 $.Deferred() 这里。

我不是在寻找关于如何重组代码以避免链接的建议,我无法更改它(我也不能分享它,因此是人为的例子)。

【问题讨论】:

  • 对不起,我真的不明白问题是什么?您可以使用p1.then(fn),其中fn 返回另一个promise 或一个值——两者都可以。如果它返回一个承诺,它将链接承诺。如果它返回一个值,则该值将沿链传递。
  • @jfriend00 谢谢,我添加了一些细节来解释为什么(我相信,可能被误导).then() 在这里不相关。在您的提案中,fn 在评估fn 时是否必须知道p2 的存在?
  • 你没有展示足够的真实代码让我理解你认为你遇到的问题。在我对p1.then(fn) 的建议中,fn 仅在 p1 解决后执行。那时你必须知道你是返回另一个承诺还是只是一个值,你可以返回当时的任何一个。在解决p1 之后调用fn 之前,无需知道它是否是另一个承诺。
  • 有点,根据定义,如果你还不知道如何解决fn,但当它被调用时,你会返回一个承诺并在你知道后解决该承诺,你总是可以解决当需要解决它时,它会带有另一个承诺或价值。如果你用一个 Promise 解决它,它会扩展 Promise 链。如果你用一个值来解析它,这个值会通过链传回。
  • @jfriend00 再次修改了示例代码,如果不是更清楚请告诉我。我无法分享真实的代码,而且它肯定不会让事情变得更清楚。

标签: jquery-deferred


【解决方案1】:

链接延迟

如果您想将p1 视为p2 的代表,请像这样连接它们:

p2.then(p1.resolve, p1.reject, p1.notify)

然后,例如,如果您调用p2.resolve(x),它将调用p1.resolve(x)。

你为什么要这样做?

一个具体的例子:从 setTimeout 回调内部调用 $.get() ,在辅助函数内部:

// Sends a GET request to `url` after `delayMs`.
// Returns a jQuery promise.
function startDelayedRequest(url, delayMs) {
    var p1 = new $.Deferred();
    setTimeout(function() {
        var p2 = $.get(url);
        p2.then(p1.resolve, p1.reject, p1.notify);
    }, delayMs);
    return p1;
}

【讨论】:

  • 这是“第一次尝试”注释中的代码 - 我很惊讶地看到 p1 解析为一个承诺 (p2),而不是解析时产生的 val p2。
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多