$ q promise错误回调链

时间:2014-10-18 16:49:28

标签: angularjs angular-promise chain

在以下代码中,将记录error 1success 2代码段。如果原始延迟被拒绝,我怎样才能传播被调用的错误回调而不是被调用的成功回调。



angular.module("Foo", []);
angular
.module("Foo")
.controller("Bar", function ($q) {
    var deferred = $q.defer();
      deferred.reject();

      deferred.promise
          .then(
              /*success*/function () { console.log("success 1"); },
              /*error*/function () { console.log("error 1"); })
          .then(
              /*success*/function () { console.log("success 2"); },
              /*error*/function () { console.log("error 2"); });
});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="Foo">
    <div ng-controller="Bar"></div>
</div>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:31)

错误通过在错误回调

中返回$q.reject来传播
    var deferred = $q.defer();
      deferred.reject();

      deferred.promise
          .then(
              /*success*/function () { console.log("success 1"); },
              /*error*/function () { console.log("error 1"); return $q.reject('error 1')})
          .then(
              /*success*/function () { console.log("success 2"); },
              /*error*/function () { console.log("error 2"); });
});

答案 1 :(得分:15)

将成功/失败视为try / catch

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

如果catch没有抛出异常,则认为错误被处理,因此外部调用函数没有看到内部函数中发生的错误。

此处发生类似的事情,您必须从承诺返回return $q.reject();,以便链中的下一个承诺也失败。请参阅示例plunker:http://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p=preview

原因是:您的错误处理程序可能会采取措施更正错误。在你的错误函数中你处理错误,如果没有另外指定,它将返回一个新的promise,它被解决。因此,默认情况下使下一个承诺失败是不合理的(try-catch类比)。

顺便说一下,如果你感觉到一个错误条件,你甚至可以从 success 处理程序返回$q.reject(),以使链中的下一个承诺失败。 您正在捕获错误并对其进行处理 - 因此它会转到成功处理程序。如果你想拒绝它,你必须通过返回$ q.reject();

来做到这一点

答案 2 :(得分:6)

要对注释求和,要在promise链中传播错误,请执行以下操作:

1)不要为errorCallback提供then

deferred.promise
.then(
  /*success*/function () { console.log("success 1"); },
.then(
  /*success*/function () { console.log("success 2"); },
  /*error*/function () { console.log("error 2"); }); // gets called

或者

2)从$q.reject()

返回errorCallback
deferred.promise
.then(
  /*success*/function () { console.log("success 1"); },
  /*error*/function (err) { console.log("error 1"); return $q.reject(err); });
.then(
  /*success*/function () { console.log("success 2"); },
  /*error*/function () { console.log("error 2"); }); // gets called

来自angular $q.reject documentation

This api should be used to forward rejection in a chain of promises.