我正在尝试链接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()这里。
我不是在寻找关于如何重构代码以避免链接的建议,我无法改变它(我也无法分享它,因此是人为的例子)。
答案 0 :(得分: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;
}