2

我有嵌套的承诺,其中一个函数调用另一个函数并且都返回承诺。函数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

4

2 回答 2

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它将自动传播。

于 2013-11-12T21:38:10.777 回答
0

我想知道是否有办法在不创建延迟函数 b 的情况下解决这个问题

不,我不相信有。如果a设法解决了自己的 deferred,并且b想要返回一个 deferred,它得到了两个结果值,其中一个是 的结果a,那么您必须在 内实例化一个新的 deferred 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()

于 2013-11-12T20:44:30.023 回答