2017-09-04 2 views
0

ich einen Winkel Service haben, die eine Login-Funktion, um in einem Benutzer anmelden sieht vor:Winkel Rückkehr Versprechen, das bereits einen Haken hat

app.service('AuthSharedService', function($rootScope, $http, authService, UserSession) { 
    this.login = function(email, password, rememberMe) { 
     return $http.post('/login', 
       { 
        'email': email, 
        'password': password, 
        'rememberMe': rememberMe 
       }) 
      .then(function(response){ 
       console.log("success 1"); 
       authService.loginConfirmed(response.data); 
      }).catch(function(response){ 
       console.log("catch 1"); 
      }).finally(function(response){ 
       console.log("finally 1"); 
      }); 
    }; 
    return this; 
}); 

ich auch einen Controller haben, der mit einem HTML-Anmeldeformular gebunden ist:

app.controller("loginController", 
    function ($scope, $rootScope, $window, $http, $routeParams, AuthSharedService){ 
     var vm = this; 
     vm.email; 
     vm.password; 
     vm.rememberMe; 
     vm.login = function(){ 
      AuthSharedService.login(vm.email, vm.password, vm.rememberMe) 
       .then(function(response){ 
        console.log("success 2"); 
       }).catch(function(response){ 
        console.log("catch 2"); 
       }); 
     } 
    } 
); 

Bisher ist es sehr einfach.
Aber wenn ich die Datenbank-Benutzertabelle lösche und dann versuche mich einzuloggen, bekomme ich natürlich einen internen Fehler 500 auf dem REST-Server. Aber die Konsolenausgabe von eckig ist dann:

catch 1 
success 2 

Aber warum? Kann ich keine $http zurückgeben, um die .then(function()) und die .catch(function()) zweimal zu verwenden?

Dank für jede Hilfe :)
freundlichen Grüßen

Antwort

1

catch gibt ein neues Versprechen, die standardmäßig erfolgreich ist; das Sie erlaubt, Ketten zu schaffen, die Fehler zu fangen und dann mit einigem Standard-Erfolgsszenario weiter:

returnsPromise() 
    .catch(() => 'default value') 
    .then(value => alert(value)) 

Dies wird entweder den Wert von returnsPromise alarmieren, oder, falls dies nicht möglich, einen Standardwert von 'default value'.

Was möchten Sie ist die ursprüngliche $http Versprechen zurückzukehren, nicht gefangen Versprechen:

let p = $http.post(...); 
p.catch(...); 
return p; 

Wenn post() ausfällt, die bereits angebracht catchund alle anderen Fehler-Handler Sie anhängen können wird erhalten, wenn ein genannt Fehler tritt auf. Umgekehrt, nur wenn erfolgreich ist, werden die Erfolgshandler aufgerufen (und catch wird nicht).

2

Wenn Sie .catch aufrufen, gibt es eine Verheißung zurück. Wenn Sie nichts zurückgeben, wird eine automatisch aufgelöste Zusage zurückgegeben.

Wenn Sie das Versprechen, in einem Fehlerzustand nach einer .catch behalten möchten, können Sie dies tun:

promise 
.catch(function(response) { 
    handleResponse(response); 
    return $q.reject(response); 
}); 

Sie können dies auch tun:

var promise = ...; 
promise.catch(...); 
return promise 

Aber im Auge behalten Wenn der Rückruf catch asynchron ist, wird sich dieser Code wahrscheinlich nicht wie gewünscht verhalten.

Verwandte Themen