Как всегда запускать некоторый код, когда обещание выполняется в 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   81  

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/