Las promesas (promises) son una buena herramienta a la hora de crear codigo asincrono en aplicaciones JavaScript. En AngularJS podemos usar el servicio $q
Este servicio esta basado en la libreria Q de Kris Kowal. Una de las funciones que tiene es la de poder evaluar un array de varias promesas una vez se han ejecutado todas con el metodo all
Por ejemplo, veamos como podriamos evaluar 3 promesas con el servicio $http
var urls = ['http://www.google.es', 'http://www.myfakeurl.biz', 'http://www.angularjs.org']; var promises = urls.map(function(url) { return $http({ method: 'GET', url: url }); }); $q.all(promises).then(function(data) { console.log(data); });
De esta manera una vez se ejecuten todas las llamadas nuestra funcion sera invocada… Oh! Wait! Que es lo que pasa en realidad?. La segunda llamada es erronea y entonces directamente se llama a la funcion then con un error aun cuando hay 2 que si funcionan
Que pasa entonces si queremos ver cuales de nuestras promesas han sido ejecutadas correctamente y cuales han sido erroneas? La libreria Q antes mencionada tiene una funcion llamada allSettled
que una vez evaluadas todas las promesas devuelve un array con los resultados de cada una de ellas. Por desgracia en AngularJS allSettled no esta implementado en la version actual (v.1.4.8)
Gracias a la comunidad Open Source encontramos una libreria que justo nos provee de esa funcionalidad y otras mas. La libreria se llama angular-promise-extras y puede instalarse como cualquier paquete mediante bower
Una vez instalada y añadida a nuestras dependencias de AngularJS podemos reescribir nuestro codigo de la siguiente manera
var urls = ['http://www.google.es', 'http://www.myfakeurl.biz', 'http://www.angularjs.org']; var promises = urls.map(function(url) { return $http({ method: 'GET', url: url }); }); $q.allSettled(promises).then(function(results) { results.forEach(function (result) { if (result.state === 'fulfilled') { console.error(result); } else if {result.state === 'rejected'} { console.error(result); } }); }
De esta forma podremos saber cuales de nuestras promesas han sido satisfactorias (fulfilled) y cuales han fallado (rejected)