In meiner Angular.js-Anwendung führe ich eine asynchrone Operation aus. Bevor es beginnt, bedecke ich die Anwendung mit einem modalen Div. Sobald der Vorgang abgeschlossen ist, muss ich den Div entfernen, unabhängig davon, ob der Vorgang erfolgreich war oder nicht.
Derzeit habe ich Folgendes:
LoadingOverlay.start();
Auth.initialize().then(function() {
LoadingOverlay.stop();
}, function() {
LoadingOverlay.stop(); // Code needs to be duplicated here
})
Es funktioniert gut, aber ich hätte lieber etwas saubereres wie diesen Pseudocode:
LoadingOverlay.start();
Auth.initialize().finally(function() { // *pseudo-code* - some function that is always executed on both failure and success.
LoadingOverlay.stop();
})
Ich gehe davon aus, dass es ein weit verbreitetes Problem ist, also dachte ich, es könnte getan werden, kann aber nichts im Dokument finden. Irgendeine Idee, ob es möglich ist?
then()
, dann können Sie sicher Kette eine andere ....initialize().then(...).then(...)
. Es gibt kein "endlich" als solches; Der letzte Handler ist der zuletzt angegebene.initialize()
fehlschlägt, müssen Sie immer noch sowohl eine "Erfolgs" -Funktion als auch eine "Fehler" -Funktion deklarieren und dort Code duplizieren..then()
- siehe "The Promise API" hier . Die einzige Freiheit besteht darin, eine zu haben.then()
oder mehrere.then()
s zu verketten . Sie sind nicht der erste, der sich eine umfassendere Versprechen-API wünscht - die gewünschte Funktion wird hier offiziell angefordert .always(callback)
wird in Winkel 1.2.6 nicht implementiert oder zurückgesetzt. Wir müssenfinally
jetzt verwenden. Ich frage mich, warum das reservierte Wortfinally
besser ist alsalways
.Antworten:
Die Funktion wurde in dieser Pull-Anforderung implementiert und ist jetzt Teil von AngularJS. Es wurde ursprünglich "immer" genannt und später in "umbenannt"
finally
, daher sollte der Code wie folgt lauten:Da
finally
es sich um ein reserviertes Schlüsselwort handelt, muss es möglicherweise als Zeichenfolge festgelegt werden, damit es in bestimmten Browsern (z. B. IE und Android Browser) nicht beschädigt wird:quelle
always
, wurde jedoch geändert,finally
wie Sie in diesem Commit (oder in der Quelle) sehen können: github.com/angular/angular.js/commit/…finally
gibt wie der Rest ein Versprechen zurück, sodass Sie es verketten können. Jedoch (zumindest auf einigen Versionen von Angular) der Bequemlichkeit Überlastungensuccess
underror
sind nur auf die unmittelbare Rückkehr von hinzugefügt$http
, so dass , wenn Sie beginnen mitfinally
Ihnen diese Methoden verlieren.Ich verwende Umbraco Version 7.3.5 Backend mit AngularJS Version 1.1.5 und habe diesen Thread gefunden. Als ich die genehmigte Antwort implementierte, bekam ich den Fehler:
Was jedoch funktionierte, war
always
. Wenn jemand, der eine alte Version von AngularJS verwendet, diesen Thread findet undfinally
diesen Code nicht verwenden kann, verwenden Sie ihn stattdessenquelle
Wenn Sie angularJS nicht verwenden und den Fehler nicht abfangen können (nicht sicher, ob .finally () dies tun würde), können Sie .catch (). Then () verwenden, um den duplizierten Code zu vermeiden.
Der catch () kann ohnehin für die Protokollierung oder andere Bereinigung nützlich sein. https://jsfiddle.net/pointzerotwo/k4rb41a7/
quelle
Ich würde ngView verwenden, um den Inhalt der Seite zu rendern und das Entfernen von Ihnen modal für das Ereignis $ viewContentLoaded auszulösen. Siehe http://docs.angularjs.org/api/ng.directive:ngView für dieses Ereignis und http://docs.angularjs.org/api/ng . $ RootScope.Scope für den Listener $ on event.
quelle