javascript - software - instalar angularjs
Angularjs prometen rechazar el encadenamiento (2)
Necesito crear promesas encadenadas:
var deferred = $q.defer();
$timeout(function() {
deferred.reject({result: ''errror''});
}, 3000);
deferred.promise.then(angular.noop, function errorHandler(result) {
//some actions
return result;
}).then(function successCallback(result) {
console.log(''what do I do here?'');
return result;
}, function errorCallback(result) {
$scope.result= result;
return result;
});
Si pongo un errorCallback en el primero then
, el segundo se resolverá y se llamará su successCallback. Pero si errorHandler
, la segunda promesa será rechazada.
Según los documentos de Angular JS, la única forma de propagar el rechazo es devolver $q.reject();
y no parece obvio, especialmente porque tengo que inyectar el servicio $q
incluso si no es necesario;
También se puede hacer lanzando una excepción en errorHandler
, pero escribe un seguimiento de excepciones en la consola, no es bueno.
¿Hay otra opción para hacer esto de manera clara? ¿Y cuál es la razón? ¿Por qué se hace? ¿En qué caso, el comportamiento actual puede ser útil?
Y cuál es la razón por la que se hace. ¿En qué caso, el comportamiento actual puede ser útil?
Puede ser útil cuando en errorHandler podría intentar reparar el estado de error y resolver la promesa de alguna manera.
var retriesCount = 0;
function doWork()
{
return $http.post(''url'')
.then(function(response){
// check success-property of returned data
if(response.data.success)
// just unwrap data from response, may be do some other manipulations
return response.data;
else
// reject with error
return $q.reject(''some error occured'');
})
.catch(function(reason){
if(retriesCount++ < 3)
// some error, let me try to recover myself once again
return doWork();
else
// mission failed... finally reject
return $q.reject(reason);
});
}
doWork().then(console.log, console.error);
Tarde a la fiesta, pero como estoy aquí;
Prefiero usar el error $http
para su manejo de errores nativo, en lugar de devolver un éxito a través de un 200
y un estado de error en la respuesta.
la impresión de 400
o 500
errores en la consola no es un problema, si está depurando, los verá si no lo hace.
angular.module(''workModule'', [])
// work provider handles all api calls to get work
.service(''workProvider'', [''$http'', ''$q'', function($http, $q) {
var endpoint = ''/api/v1/work/'';
this.Get = function(){
// return the promise, and use 404, 500, etc for errors on the server
return $http.get(endpoint);
};
}])
.controller(''workController'', [''workProvider'', function(''workProvider''){
workProvider.Get().then(
function(response){ // success
console.log(response.data);
},
function(response){ // error
console.log(response.data);
}
)
}])