如何在Angular.js中履行promise时始终运行一些代码

lau*_*ent 83 javascript finally promise deferred angularjs

在我的Angular.js应用程序中,我正在运行一些异步操作.在它开始之前我用模态div覆盖应用程序,然后一旦操作完成,我需要删除div,无论操作是否成功.

目前我有这个:

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

它运作良好,但我更喜欢像这个伪代码一样更清洁:

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

我想这是一个相当普遍的问题,所以我想这是可以做到,但不能找到文档中任何事情.有什么想法可以吗?

lau*_*ent 162

该功能已在此拉取请求中实现,现在是AngularJS的一部分.它最初被称为"始终",然后重命名为finally,所以代码应如下所示:

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

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

$http.get('/foo')['finally'](doSomething);
Run Code Online (Sandbox Code Playgroud)

  • 对于从网络搜索中发现这一点的任何人来说,答案中的链接指的是函数`always`但是它被改为`finally`,你可以在这个提交中看到(或者在源代码中):https://github.com /angular/angular.js/commit/f078762d48d0d5d9796dcdf2cb0241198677582c (10认同)
  • @Brian`final`和其他人一样返回一个承诺,所以你可以链接它.然而(至少在某些版本的Angular上)方便重载`success`和`error`只会添加到`$ http`的立即返回,所以如果你_start_与`finally`你将失去那些方法. (4认同)
  • 先生,让我的一天! (2认同)

Ogg*_*las 7

我正在使用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
});
Run Code Online (Sandbox Code Playgroud)