为什么$ q.when后跟Angular.js中的$ q.reject会导致成功?

时间:2016-04-28 12:39:49

标签: javascript angularjs angular-promise

在Angular.js中使用$ q时,为什么不使用此代码:

 $q.when("test")
   .then($q.reject("error"))
   .then(
     function(v) {
       $scope.result = "Success: " + v;
     },
     function(e) {
       $scope.result = "Failure: " + e;
     }
   )

调用错误回调?

在jsfiddle中:http://jsfiddle.net/c9tv6kz7/1/

3 个答案:

答案 0 :(得分:3)

Per the doc

  

然后(successCallback,errorCallback,notifyCallback) - 无论如何   当承诺已经或将要解决或拒绝时,请拨打一个   成功或错误回调一旦结果异步   是可用的。使用单个参数调用回调:   结果或拒绝原因。另外,通知回调可能是   在之前调用零次或多次以提供进度指示   承诺得到解决或拒绝。

     

此方法返回通过解析或拒绝的新承诺   successCallback的返回值,errorCallback(除非那个   value是一个promise,在这种情况下,它用值来解析   使用promise chaining解决了这个承诺。它也通知   通过notifyCallback方法的返回值。承诺不能   从notifyCallback方法中解析或拒绝。

我们真正关心的是

  

此方法返回通过解析或拒绝的新承诺   successCallback的返回值,errorCallback

每次在then上致电$q.when,您都会创建新承诺。即使第一个承诺被拒绝,第二个承诺也没有。第二个没有被拒绝,因为successCallback和errorCallback的返回值没有拒绝它。

答案 1 :(得分:2)

更简单的答案是:

$q.reject("error")

创建一个新的promise对象,由$q.when().then()

调用

这真的不符合你的想法。 $q.reject("error")返回一个带有then函数的对象。

请查看docs中的方法部分:

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);
});

你是否看到他们的行为then(function () { return $q.reject(reason); })与原作有很大不同。

查看新的fiddle

答案 2 :(得分:0)

当我这样做时,我解决了一个错误:

var myApp = angular.module('myApp', []);

myApp.controller('MyCtrl', ['$scope', '$q', function($scope, $q) {
  $q.when("test")
    $q.reject('Failed!')
    .then(
      function(v) {
        $scope.result = "Success: " + v;
      },
      function(e) {
        $scope.result = "Failure: " + e;
      }
    )
}]);

http://jsfiddle.net/emporio/67db45f9/3/

如果我删除$q.reject('Failed!'),它将解析为.then()。