如何在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/