$ q promise错误回调链

Ste*_*ler 25 chain angularjs angular-promise

在下面的代码片段error 1,并success 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"); });
});
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

Cha*_*ani 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"); });
});
Run Code Online (Sandbox Code Playgroud)


har*_*shr 15

将成功/失败视为try/catch

try{
    var val = dummyPromise();
} catch (e){
    val = "SomeValue";
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


use*_*062 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
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)

角度$ q.reject文档:

This api should be used to forward rejection in a chain of promises.
Run Code Online (Sandbox Code Playgroud)

  • 文档的这一部分非常容易错过,因为它之前的"Chaining Promises"部分完全没有提到promise错误不会自动传播的事实. (2认同)