2017-04-05 4 views
3

Ich habe eine funktionierende angular2 Wache mit einer canActivate(), die einen Dienst für isLoggedIn() aufruft und ein Versprechen zurückgibt, das dann löst und die Route angemessen behandelt wird.Negieren des Ergebnisses eines Versprechens in einer Wache

Allerdings versuche ich das Gegenteil zu tun, zu sehen, wenn der Benutzer nicht angemeldet ist, und es funktioniert nicht.

habe ich versucht, etwas so einfaches wie dies (das Hinzufügen eines Operator!), Es funktionieren würde, der Hoffnung:

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private authService: AuthService) {} 

    canActivate() { 
     return !this.authService.isLoggedIn(); 
    } 
} 

Dies ist jedoch immer wieder einen Falsey Wert und die Route aktiviert nie.

Dies ist ein relevanter Auszug meiner isLoggedIn() Funktion:

isLoggedIn(): Promise<Boolean> { 
    var component = this; 
    return new Promise((resolve, reject) => {  
     component.queryForUser((user) => { 
     resolve(user != null); 
     }); 
    } 
    }); 
} 

Wenn der Benutzer nicht gleich null ist, dann ist er angemeldet und das Versprechen löst mit wahr. Sonst, falsch.

Während ich einfach einen Parameter hinzufügen könnte, um anzugeben, welchen Zustand ich suche, oder sogar eine isNotLoggedIn() Funktion mit der gleichen Logik aber invertiert, frage ich, gibt es eine Möglichkeit, den Wert der Versprechung des Versprechens für zu negieren die canActivate()?

+0

Behandle ein Versprechen wie ein Versprechen. '.then (...)' –

Antwort

6

return !this.authService.isLoggedIn() wird nicht funktionieren, weil, wie JS funktioniert. this.authService.isLoggedIn() ist Versprechen Objekt und ist truthy. !this.authService.isLoggedIn() wird immer falsch sein.

Stattdessen versprechen Ergebnis sollte mit

canActivate() { 
    return this.authService.isLoggedIn().then(result => !result); 
} 

Oder

async canActivate() { 
    return !(await this.authService.isLoggedIn()); 
} 

Die Klammern um await ... sind optional und wird verwendet, um die Lesbarkeit zu negierten Ergebnis abgebildet werden.

+0

Ich bin neu in TypeScript. Bisher habe ich den '=>' Operator in '(a) => (sth (a))' als Abkürzung für 'function (a) {sth (a)}' verwendet. Was ist '=>' in diesem Fall? Ist es das Gleiche, nur noch kürzer? –

+1

Genau gesagt, es ist 'Funktion (a) {return sth (a)}', sollte implizite Rückkehr immer im Auge behalten werden, weil es Dinge ruinieren kann. Ja, es ist eine Abkürzung für einen Param. Es ist Geschmackssache, es zu benutzen oder nicht. Ich persönlich benutze es nicht in meinem eigenen Style Guide, weil es inkonsistent ist (die Inkonsistenz wird hier insbesondere diskutiert http://stackoverflow.com/a/41086381/3731501). – estus

3

Alles, was Sie tun müssen, ist einige weitere Manipulation des aufgelösten Wert Versprechen:

canActivate() { 
    return this.authService.isLoggedIn().then(loggedIn => !loggedIn); 
} 
Verwandte Themen