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

在我的 Angular.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();
})

我认为这是一个很普遍的问题,所以我认为这可以做到,但无法找到任何东西的文件。知道能不能做到吗?

72069 次浏览

我将使用 ngView 来呈现页面的内容,并触发删除事件 $viewContentLoadedyou 模式。有关该事件,请参见 http://docs.angularjs.org/api/ng.directive:ngViewhttp://docs.angularjs.org/api/ng。$rootScope.$on 事件侦听器的范围。

该特性已经在 这个请求中实现,现在是 AngularJS 的一部分。它最初被称为“ always”,后来被重命名为 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后端 AngularJS 版本1.1.5,并找到了这个线程。当我执行批准的答案时,我得到了一个错误:

Xxx (...) . then (...) . finally 不是一个函数

然而,真正起作用的是 always。如果其他使用 AngularJS 旧版本的用户发现这个线程并且不能使用 finally,请使用这段代码

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

对于那些没有使用 angularJS 的用户,如果您可以捕获错误(不确定是否可以)。最后()会这样做,您可以使用。接住。然后()避免重复的代码。

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

Catch ()最终可能对日志记录或其他清理非常有用。 Https://jsfiddle.net/pointzerotwo/k4rb41a7/