example defer array all javascript angularjs promise deferred finally

javascript - defer - Cómo ejecutar siempre algún código cuando se cumple una promesa en Angular.js



js q all (4)

En mi aplicación Angular.js, estoy ejecutando alguna operación asincrónica. Antes de que comience, cubro la aplicación con un div modal, luego, una vez que se completa la operación, necesito eliminar el div, si la operación fue exitosa o no.

Actualmente tengo esto:

LoadingOverlay.start(); Auth.initialize().then(function() { LoadingOverlay.stop(); }, function() { LoadingOverlay.stop(); // Code needs to be duplicated here })

Funciona bien, sin embargo, preferiría tener algo más limpio como este pseudo-código:

LoadingOverlay.start(); Auth.initialize().finally(function() { // *pseudo-code* - some function that is always executed on both failure and success. LoadingOverlay.stop(); })

Supongo que es un problema bastante común, así que pensé que podría hacerse, pero no puedo encontrar nada en el documento. Alguna idea si se puede hacer?


Estoy usando Umbraco versión 7.3.5 back end con AngularJS versión 1.1.5 y encontré este hilo. Cuando implementé la respuesta aprobada, recibí el error:

xxx (...). luego (...). finalmente no es una función

Lo que funcionó sin embargo fue always . Si alguien más que usa una versión anterior de AngularJS encuentra este hilo y no puede usarlo, finally use este código

LoadingOverlay.start(); Auth.initialize().then(function() { // Success handler }, function() { // Error handler }).always(function() { // Always execute this on both error and success });


La característica se ha implementado en esta solicitud de extracción y ahora es parte de AngularJS. Inicialmente se llamó "siempre" y luego se renombró a finally , por lo que el código debería ser el siguiente:

LoadingOverlay.start(); Auth.initialize().then(function() { // Success handler }, function() { // Error handler }).finally(function() { // Always execute this on both error and success });

Tenga en cuenta que, dado que finally es una palabra clave reservada, podría ser necesario convertirla en una cadena para que no se rompa en ciertos navegadores (como el navegador IE y Android):

$http.get(''/foo'')[''finally''](doSomething);


Para aquellos que no usan angularJS, y si está bien con la captura del error (no estoy seguro si finalmente lo haría), podría usar .catch (). Then () para evitar el código duplicado.

Promise.resolve() .catch(() => {}) .then(() => console.log(''finally''));

El catch () podría terminar siendo útil de todos modos para el registro u otra limpieza. https://jsfiddle.net/pointzerotwo/k4rb41a7/