承诺返回承诺

时间:2013-11-12 20:16:01

标签: javascript jquery promise

我有一个嵌套的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

中创建延迟的情况下进行此操作

2 个答案:

答案 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()的结果,那么确切地知道为什么要这样构造它会很有趣。您可能需要考虑为ab创建完全独立的延迟结果,然后在调用它们时加入它们而不是嵌套调用。使用$ .when():

$.when(a(), b()).done(function(a,b) {
    // process both results
}).fail(function(a,b) {
    // process both results
});

这样写b()无需了解a()