【发布时间】: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