如何在Angular.js中实现承诺时始终运行一些代码

在我的Angular.js应用程序中,我正在运行一些asynchronous操作。 在开始之前,我用模态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(); }) 

我认为这是一个很常见的问题,所以我认为可以做,但在文档中找不到任何东西。 任何想法,如果可以做到?

该function已经在这个拉取请求中实现,现在是AngularJS的一部分。 它最初被称为“总是”,后来改名为finally ,所以代码应该如下:

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

请注意,由于finally是一个保留关键字,因此可能需要将其设置为string,以便在某些浏览器(如IE和Android Browser)上不会中断:

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

我使用Umbraco版本7.3.5后端AngularJS版本1.1.5,并发现这个线程。 当我执行批准的答案时,我得到了错误:

xxx(…)。then(…)。最后不是一个函数

什么工作,但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:ng查看该事件和http://docs.angularjs.org/api/ng。$ rootScope.Scope for $ on事件侦听器。

对于那些不使用angularJS的人来说,如果可以捕捉错误(不知道.finally()是否会这样做),可以使用.catch()。then()来避免重复的代码。

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

catch()可能最终会有用于logging或其他清理。 https://jsfiddle.net/pointzerotwo/k4rb41a7/