有人能解释为什么函数返回的第二个承诺得到解决?它的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;
答案 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);
}