Angular解决了"然后"当主承诺被拒绝时起作用

时间:2017-03-26 21:51:32

标签: angularjs angular-promise

有人能解释为什么函数返回的第二个承诺得到解决?它的Promises实现看起来像Angular JS bug。根据文件here,第二个承诺也应该被拒绝。



// Code goes here
var myMod = angular.module("myMod", []);
myMod.controller('bodyCtrl', function($scope, $timeout, $q) {
    var deferred = $q.defer();
    deferred.promise.then(function(d) {
      console.log("success called");
      return d;
    }, function(d) {
      console.log("failure called");
      return d;
    })
    .then(function(d) {
      console.log("success called2");
      return d;
    }, function(d) {
      console.log("failure called2");
      return d;
    });
    
    $timeout(function() {
      deferred.reject();
    }, 2 * 1000);
});

<!DOCTYPE html>
<html ng-app="myMod">

  <head>
    <script src="https://code.angularjs.org/1.5.8/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-controller="bodyCtrl">
    <h1>Hello Plunker!</h1>
  </body>

</html>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

这是设计的。这是因为通过使用errorCallback提供promise,您实际上正在处理/解析/捕获拒绝(就像您在try ... catch块中捕获异常一样)。如果删除第一个errorCallback函数,则应该在开发人员控制台中看到failure called2,或者如果您在第一个回调中抛出新的异常。

答案 1 :(得分:1)

正如 @Nikolaj Dam Larsen @georgeawg 所说,你的问题是在你的errorCallback()中你不会抛出异常。请参阅以下示例(PLUNKER)...

function bodyCtrl($timeout, $q){
    deferred.promise
    .then(function(d) { //Promise 1
        console.log("success called");
        return d;
    }, function(e) {
        console.log("failure called");
        throw e; //Throw instead return
    })
    .then(function(d) { //Promise 2
        console.log("success called2");
        return d;
    }, function(e) {
        console.log("failure called2");
        throw e; //Throw instead return
    });

    $timeout(function() {
        deferred.reject("Custom Rejected: " + new Date());
    }, 2000);
}