escape angularjs angular-promise chain

angularjs - escape - $ q prometen cadenas de devolución de llamada de error



ng-bind-html angularjs (3)

El error se propaga devolviendo $q.reject en la devolución de llamada de error

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

En el siguiente fragmento de código, se registrarán el error 1 y el success 2 . ¿Cómo puedo propagar devoluciones de llamada de error que se invocan en lugar de invocar devoluciones de llamada correctas si se rechaza el aplazamiento original?

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>


Para resumir los comentarios, para propagar errores en la cadena de promesa, ya sea:

1) No proporcione un errorCallback para 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

O

2) Devuelve $q.reject() desde el 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

Desde la documentación angular $ q.reject :

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


piensa en el éxito / fracaso como prueba / captura

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

Si catch no lanza una excepción, se considera que el error se maneja y, por lo tanto, la función de llamada externa no ve el error que ocurrió en la función interna.

return $q.reject(); similar sucede aquí, tienes que devolver return $q.reject(); de una promesa para que la siguiente promesa en la cadena también falle. Ver ejemplo plunker: http://plnkr.co/edit/porOG8qVg2GkeddzVHu3?p=preview

La razón es: su controlador de errores puede tomar medidas para corregir el error. En su función de error, tratar con el error, si no se especifica lo contrario, devolverá una nueva promesa que se resuelve. Por lo tanto, no es razonable que la siguiente promesa falle de forma predeterminada (analogía try-catch).

Por cierto, puede devolver $q.reject() incluso desde un controlador de éxito , si detecta una condición de error, para que la siguiente promesa de la cadena falle. Usted está captando el error y manejándolo, por lo que llega al controlador de éxito. Si desea rechazarlo, debe hacerlo devolviendo $ q.reject ();