Как всегда запускать некоторый код, когда обещание выполняется в Angular.js
в моем угловом.JS приложение, я запускаю некоторые асинхронные операции. Перед его запуском я покрываю приложение модальным div, а затем, как только операция завершена, мне нужно удалить div, независимо от того, была ли операция успешной или нет.
В настоящее время у меня есть это:
LoadingOverlay.start();
Auth.initialize().then(function() {
LoadingOverlay.stop();
}, function() {
LoadingOverlay.stop(); // Code needs to be duplicated here
})
он работает хорошо, однако я бы предпочел иметь что-то более чистое, как этот псевдо-код:
LoadingOverlay.start();
Auth.initialize().finally(function() { // *pseudo-code* - some function that is always executed on both failure and success.
LoadingOverlay.stop();
})
Я предполагаю, что это довольно распространенная проблема, поэтому я думал, что это может быть сделано, но ничего не может найти в документе. Есть идеи, если это можно сделать?
4 ответа:
эта функция была реализована в это тянуть запрос и теперь является частью AngularJS. Первоначально он назывался "всегда", а затем переименован в
finally
, поэтому код должен быть следующим:LoadingOverlay.start(); Auth.initialize().then(function() { // Success handler }, function() { // Error handler }).finally(function() { // Always execute this on both error and success });
обратите внимание, что с
finally
является зарезервированным ключевым словом, может потребоваться сделать его строкой, чтобы он не ломался в некоторых браузерах (например, IE и Android Browser):$http.get('/foo')['finally'](doSomething);
Я использую Umbraco версии 7.3.5 back end с AngularJS версии 1.1.5 и нашел этот поток. Когда я реализовал утвержденный ответ, я получил ошибку:
xxx(...).затем.(..).наконец-то это не функция
что же все-таки работало
always
. Если кто-то еще использует старую версию AngularJS находит этот поток и не может использоватьfinally
используйте этот код вместоLoadingOverlay.start(); Auth.initialize().then(function() { // Success handler }, function() { // Error handler }).always(function() { // Always execute this on both error and success });
Я бы использовал ngView для визуализации содержимого страницы и запуска удаления вас модально на событии $viewContentLoaded. См.http://docs.angularjs.org/api/ng.directive:ngView для этого события и http://docs.angularjs.org/api/ng.$rootScope. Scope для прослушивателя событий $on.
для тех, кто не использует angularJS, и если вы в порядке с ловлей ошибки (не уверен, если .наконец () сделал бы это), вы могли бы использовать .поймать.)(затем (), чтобы избежать дублирования кода.
Promise.resolve() .catch(() => {}) .then(() => console.log('finally'));
catch () может оказаться полезным в любом случае для ведения журнала или другой очистки. https://jsfiddle.net/pointzerotwo/k4rb41a7/