【发布时间】:2013-11-12 20:16:00
【问题描述】:
我有嵌套的承诺,一个函数调用另一个函数并且都返回承诺。函数b 正在调用函数a 并且当函数a 的承诺完成时,函数b 解决了它自己的延迟并从a 传递结果和它自己的结果。
function a(){
var d = $.Deferred();
makeSomeAsyncCall(function(){
d.resolve('a')
})
return d.promise();
}
function b(){
var d = $.Deferred();
a= a()
a.done(function(a){d.resolve(a, 'b')})
.fail(function(a){d.reject(a, 'b')})
return d.promise();
}
b().done(function(a, b){console.log(a, b)})
.fail(function(a, b){console.log(a, b)})
我想知道是否有办法在不创建延迟函数b的情况下解决这个问题
【问题讨论】:
-
b的目的是什么?为什么b不能直接返回a?我认为你过度简化了你的例子,以至于它可以比你想要的更简单。a().done(function(a){console.log(arguments)}).fail(function(a){console.log(arguments)}) -
重点是
b必须将自己的参数添加到resolved deferred中。以便初始呼叫可以记录"a"和"b"。如果没有第二个延迟函数b,我看不到这样做的方法 -
那么答案是否定的,如果你想给它添加参数,你必须以一种或另一种形式创建一个新的延迟对象。它可以用 .then 来完成,但我认为在这种情况下它不会更干净(并且仍然需要创建一个新的延迟对象。)
-
看起来很奇怪,您在解决
b()中的承诺的同时解决了a()中的承诺,这几乎意味着您根本不需要承诺b(),只返回值 -> jsfiddle.net/SHd8f -
正如我在第一条评论中所描述的,这两个函数都必须返回一个需要以最终
done/fail方法结束的参数。
标签: javascript jquery promise