2016-10-09 3 views
0

In meiner Angular2-Anwendung verwende ich den canActivate, um den Zugriff auf Seiten zu ermöglichen. Ein Teil davon ist, mit dem Server zu überprüfen, dass der Token nicht manipuliert wurde, also bevor ich entscheiden kann, ob einem Benutzer Zugang gewährt werden kann, muss ich meine API aufrufen. Dies bedeutet, ein Observable zu abonnieren und auf eine Antwort zu warten.Warte auf beobachtbare Abonnements Angelar2

Ich muss True oder False zurückgeben, aber da ich einen Asyns Anruf mache, kann ich nicht basierend auf meiner Antwort zurückkehren. Ich weiß, ich kann nicht warten, da es single threaded ist, aber ich muss irgendwie blockieren, bis ich eine Antwort von der API zurückbekomme. meine canActivate sieht wie folgt aus:

canActivate() { 
    this.guardClient.checkToken("token") 
    .subscribe(response => { 
    let responseText = response.text().replace(/"/g, ''); 
    if (responseText === 'Ok') 
    { 
     return true; 
    } 
    if(responseText === 'denied') { 

     this.router.navigate(['login']); // redirecting to login 
     return false; 
    } 
    }); 
} 

Kann mir jemand sagen, wie dieses Problem zu lösen ??

Antwort

1

Wenn an der CanActivate Schnittstelle in Winkel 2 suchen sehe ich folgendes:

export interface CanActivate { 
    canActivate(route: ActivatedRouteSnapshot, state:  RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean; 
} 

Wie Sie sehen können, können Sie einfach einen beobachtbaren zurückkehren als auch, und nicht nur ein boolean. Dies bedeutet, dass Ihr Code so etwas neu geschrieben werden könnte.

Dies wird Angular warten auf die Observable zu lösen, bevor zu entscheiden, ob die Route angezeigt werden kann oder nicht. Beachten Sie, dass diese Methode ziemlich schnell sein sollte, um langsame Lasten zu vermeiden.

+0

Danke, das ist es! :) – methgaard