我有一个嵌套的promise,函数调用另一个函数,并返回promises。函数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
答案 0 :(得分:2)
我想知道是否有办法在没有在函数b中创建延迟的情况下进行此操作
是的,有。链接两个(可能是异步的)函数是主promise方法的唯一目的,then
(在旧版本中称为pipe
)。只需写下
function b() {
return a().then(function success(aresult) {
return [aresult, "b"];
}, function error(aerror) {
return $.Deferred().reject(aerror, "b");
});
}
我不确定你是否真的需要error
处理程序,如果你没有指定它,那么aerror
将自动传播。
答案 1 :(得分:0)
我想知道是否有办法在不创建延迟的情况下对此进行调整 功能b
不,我不相信有。如果a
管理解析其自己的延迟,并且b
想要返回延迟的get 两个结果值,其中一个是a
的结果,那么您必须在b
内实例化一个新的延迟。
但是,如果在b()
中的示例处理中忽略a()
的结果,那么确切地知道为什么要这样构造它会很有趣。您可能需要考虑为a
和b
创建完全独立的延迟结果,然后在调用它们时加入它们而不是嵌套调用。使用$ .when():
$.when(a(), b()).done(function(a,b) {
// process both results
}).fail(function(a,b) {
// process both results
});
这样写b()
无需了解a()
。