【问题标题】:Promise chain success is executed after first one returns errorPromise 链成功在第一个返回错误后执行
【发布时间】:2014-07-01 17:56:09
【问题描述】:

我有一个承诺链,其中第一个承诺会导致失败,但即使这样,第二个承诺也会成功执行,而正如预期的那样应该失败......

PLUNKER LINK

我做的很简单:

dummyPromise().then(success, error).then(success, error);

所以如果第一个执行错误,则应该执行后续错误,但get是:

 1. error
 2. success

为什么会这样??

【问题讨论】:

    标签: angularjs promise angular-promise


    【解决方案1】:

    Nikos 的另一个答案是正确的 - 但我觉得这可以从同步类比中受益:

    try{
        var val = dummyPromise();
    } catch (e){
        val = "SomeValue";
    }
    secondHandler(val);
    

    您正在捕获错误并对其进行处理 - 因此它会到达成功处理程序。

    【讨论】:

    • @HarishR 显然 - 事实并非如此。 pdummyPromise 中未定义。看这里:plnkr.co/edit/oAqBKK26tmiFdNg8yMkJ?p=preview
    • 我仍然没有理解你想要表达的观点。如果你能通过 plunker 解释它会很有帮助,很抱歉打扰,但真的很想理解承诺有例外/尝试-catch
    • @HarishR 我注意到你已经接受了另一个答案——这是否意味着你理解它或者你仍然需要解释?
    • 我确实明白它为什么起作用..我现在也明白了你的例子......异常被处理并不一定意味着它被抛出......除非并且直到捕手把它扔回去...... . 好人.. 很好的例子.. 谢谢 :)
    【解决方案2】:

    你必须从一个承诺中返回return $q.reject();,这样链中的下一个承诺也会失败。查看分叉的 plunker:http://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p=preview

    原因很简单:您的错误处理程序可能会采取措施纠正错误。因此,让下一个承诺默认失败是不合理的。顺便说一句,如果您感觉到错误情况,您甚至可以从 success 处理程序返回 $q.reject(),以使链中的下一个 Promise 失败。

    【讨论】:

    • 知道了,但为什么原来的例子不起作用?背后的推理或逻辑?
    【解决方案3】:

    这就是 Promise 的工作方式。在您处理错误的 error 函数中,如果没有另外指定,它将返回一个已解决的新承诺。如果你想拒绝它,你必须通过返回$q.reject();来做到这一点 看看documentation。我发现$q.reject(); 的例子解释得很好。

    promiseB = promiseA.then(function(result) {
      // success: do something and resolve promiseB
      //          with the old or a new result
      return result;
    }, function(reason) {
      // error: handle the error if possible and
      //        resolve promiseB with newPromiseOrValue,
      //        otherwise forward the rejection to promiseB
      if (canHandle(reason)) {
       // handle the error and recover
       return newPromiseOrValue;
      }
      return $q.reject(reason);
    });
    

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2013-07-18
      • 2019-01-21
      • 2019-03-20
      • 1970-01-01
      • 2023-03-09
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多