Problema con .finally en AngularJS

flopi01

Tengo un problema que no acabo de solucionar, en una funcion que se encarga de guardar los datos en una base de datos mediante POST, me guarda todo bien, pero nunca me realiza el .finally.

$scope.sendOrder = function (shippingDetails){
			var order = angular.copy(shippingDetails);
			order.products = cart.getProducts();
			$http.post(orderUrl, order)
				.success(function(data){
					$scope.data.orderId = data.id;
					cart.getProducts().length = 0;
				})
				.error(function(error){
					$scope.data.orderError = error;
				})
				.finally(function(){
					$location.path("/complete");
				});
		}

He estado mirando y creo que puede ser que necesita antes el metodo .then pero no consigo encajarlo bien en la funcion.

S
$http.post(foo, bar).then(function(result){
 // se ejecutara cuando se resuelva la promesa con éxito
}).catch(function(err){
  // se ejecutara cuando se resuelva la promesa con error
}).finally(function(){
  // se ejecutara siempre que se resuelva la promesa
})
2 respuestas
Foxandxss

#1 Debería de funcionarte bien, no necesitas encajar ningún ".then" en ningún lado.

Mira aquí: http://plnkr.co/edit/h5tkbqHf2KMkbOPCoR0u?p=preview

success / error es solo syntactic sugar por encima de .then / .catch.

En las promesas de angular, usas .then para que te notifique cuando se resuelva y .catch por si se rechazan (finally se ejecuta si o sí). Una cosa importante con las promesas es que cuando haces algo como:

$http.get(...).then(function(result) {
  return result.data;
});

Realmente no estás devolviendo los datos en sí, si no una promesa NUEVA resuelta con ese valor. La parte importante es lo de nueva. Si encadenas varios .then, realmente es una promesa que devuelve otra que al ser resuelta devuelve otra y devuelve otra, etc etc.

Aparte lo que recibe como parámetro es lo que tu le pases al resolver, en el caso de $http es la respuesta del servidor y ya.

$http añade una capa extra tanto a .then (.success) como a .catch (.error). En este caso recibe más parámetros, en concreto "response.data", "response.status", "response.headers" y la config de $http. Aparte, devuelve la misma promesa y no una nueva.

Finally es el mismo para los dos casos, solo hay que tener en cuenta estas reglas, pero para ese caso básico no tiene que importar.

Eso sí, yo pasaría al 100% de success y error y lo haría como dice #2.

1 1 respuesta
flopi01

Gracias #2 #3 ya me queda mas claro el uso de las promesas.

Al final fue un error tonto, se me olvio añadir $location a las variables del controller.

Usuarios habituales