委托jquery延迟到另一个延迟

时间:2014-10-12 22:57:50

标签: jquery-deferred

我正在尝试链接jquery延迟,以便承诺由另一个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()这里。

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

1 个答案:

答案 0 :(得分:1)

Chaining Deferreds

如果您想将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;
}