【问题标题】:Promise that returns a promise返回承诺的承诺
【发布时间】: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


【解决方案1】:

我想知道是否有办法在不创建延迟函数 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 将自动传播。

【讨论】:

    【解决方案2】:

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

    不,我不相信有。如果a 管理自己的deferred,而b 想要返回一个得到两个 结果值的deferred,其中一个是a 的结果,那么你必须实例化一个新的deferred在b内。

    但是,考虑到在b() 中的示例处理忽略了a() 的结果,确切地知道为什么要这样构建它会很有趣。您可能需要考虑为ab 创建完全独立的延迟结果,然后在调用它们时加入它们而不是嵌套调用。使用 $.when():

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

    这样写 b() 不需要知道任何关于 a() 的事情。

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2015-11-27
      • 2023-01-27
      • 1970-01-01
      • 2017-12-21
      相关资源
      最近更新 更多