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

Javascript 为什么在Angular.js中$q.when后跟$q.reject会导致成功?,javascript,angularjs,angular-promise,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; } ) 调用错误回调 在JSFIDLE中: 然后(su

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

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

在JSFIDLE中:

然后(successCallback、errorCallback、notifyCallback)–不管 当承诺被或将被解决或拒绝时,则调用一个 一旦结果出现,成功或错误的消息将立即异步回调 有空。调用回调时使用一个参数: 结果或拒绝原因。此外,通知回调可能是 调用零次或多次以提供进度指示,然后 承诺被解决或拒绝

此方法返回一个新的承诺,该承诺通过 successCallback的返回值errorCallback(除非 价值是一种承诺,在这种情况下,它与 使用承诺链在该承诺中解决)。它还通知 通过notifyCallback方法的返回值。承诺是不可能的 无法从notifyCallback方法中解析或拒绝

我们真正关心的是

此方法返回一个新的承诺,该承诺通过 successCallback的返回值errorCallback

每次调用
时,请在
$q上执行
。当
创建新承诺时。尽管第一个承诺被拒绝,第二个承诺却没有。第二个没有被拒绝,因为successCallback和errorCallback的返回值没有拒绝它

然后(successCallback、errorCallback、notifyCallback)–不管 当承诺被或将被解决或拒绝时,则调用一个 一旦结果出现,成功或错误的消息将立即异步回调 可用。调用回调时使用一个参数: 结果或拒绝原因。此外,通知回调可能是 调用零次或多次以提供进度指示,然后 承诺被解决或拒绝

此方法返回一个新的承诺,该承诺通过 successCallback的返回值errorCallback(除非 价值是一种承诺,在这种情况下,它与 使用承诺链在该承诺中解决)。它还通知 通过notifyCallback方法的返回值。承诺是不可能的 无法从notifyCallback方法中解析或拒绝

我们真正关心的是

此方法返回一个新的承诺,该承诺通过 successCallback的返回值errorCallback


每次调用
时,请在
$q上执行
。当
创建新承诺时。尽管第一个承诺被拒绝,第二个承诺却没有。第二个没有被拒绝,因为successCallback和errorCallback的返回值没有拒绝它

更简单的答案是:

$q.reject(“错误”)

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

这真的不会像你想的那样
$q.reject(“error”)
返回带有
的对象,然后返回
函数

请参阅以下内容中的方法部分:

你看到他们是如何做的吗?
then(function(){return$q.reject(reason);})
这与你原来的版本有很大的不同


参见new

更简单的答案是:

$q.reject(“错误”)

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

这真的不会像你想的那样
$q.reject(“error”)
返回带有
的对象,然后返回
函数

请参阅以下内容中的方法部分:

你看到他们是如何做的吗?
then(function(){return$q.reject(reason);})
这与你原来的版本有很大的不同


请参见“新建”

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

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


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

当我这样做时,我会解析一个错误:

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


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

我不确定是否遵循。我期望发生的是:1)“当”创建一个立即解决成功的承诺2)“拒绝”创建一个立即解决(拒绝)失败的承诺3)“然后”创建一个依次解决第一个承诺,然后解决第二个承诺4)如果两个承诺中的任何一个失败,“then”应该用一个错误来解决。误解是你期望你的承诺相互关联。按照你写的方式,情况并非如此。你的每一个承诺都独立于之前的承诺。所以,如果一个失败了,另一个就不会了。我不确定我是否会遵守。我期望发生的是:1)“当”创建一个立即解决成功的承诺2)“拒绝”创建一个立即解决(拒绝)失败的承诺3)“然后”创建一个依次解决第一个承诺,然后解决第二个承诺4)如果两个承诺中的任何一个失败,“then”应该用一个错误来解决。误解是你期望你的承诺相互关联。按照你写的方式,情况并非如此。你的每一个承诺都独立于之前的承诺。因此,如果其中一个失败,另一个不会。您会收到错误,因为$q.reject('failed!')是一个失败的承诺。你的场景不是OP的。情况是,他将一个失败的承诺包装在一个承诺中。OP?这意味着什么?您会得到错误,因为$q.reject('failed!')是一个失败的承诺。你的场景不是OP的。情况是,他将一个失败的承诺包装在一个承诺中。OP?这是什么意思?你想要
$q.when(“错误”)。然后($q.reject)
你想要
$q.when(“错误”)。然后($q.reject)