Ich versuche, ein Observable zurückzugeben, wenn ich bei einem Abonnenten einen bestimmten Wert bekomme, aber ich versage kläglich.
Dies ist der Code:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
// get user access levels
return this._firebase.isUserAdmin <-- returns Subscription, not Observable
.map(user => user.access_level)
.subscribe( access => {
// I need to return an observable here
});
}
Es gibt nicht viele Ressourcen zu Observablen in Winkel 2, daher weiß ich nicht, wo ich anfangen soll. Kann mir bitte jemand weiterhelfen?
UPDATE -> Arbeitsversion
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
// get user access levels
return this._firebase.isUserAdmin
.map(user => {
let accessLevel = user.access_level;
if (accessLevel === 'admin' ) {
return true;
}
}).first();
}
Sie können keine Beobachtungsliste aus dem Abonnement zurückgeben. Wenn Sie jedoch map
anstelle von subscribe
verwenden, wird eine Observable
zurückgegeben.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
// get user access levels
return this._firebase.isUserAdminObservable
.map(user => {
// do something here
// user.access_level;
return true;
})
.first(); // for the observable to complete on the first event (usually required for `canActivate`)
// first needs to be imported like `map`, ...
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
let subject = new Subject();
// get user access levels
this._firebase.isUserAdminObservable
.map(user => {
let accessLevel = user.access_level;
if (accessLevel === 'admin' ) {
subject.emit(true);
subject.complete();
}
return user;
});
return subject;
}
Wir können das Observable-Objekt mithilfe der toPromise
-Methode . In ein Versprechen konvertieren.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Promise<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
// get user access levels
return this._firebase.isUserAdmin
.map(user => {
return (user.access_level === 'admin');
}).toPromise();
}
Sie benötigen keine Karte, der Code unten gibt zunächst ein Prädikat und eine Projektionsfunktion an.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
this.routeToActivate = route.routeConfig.path;
return this._firebase.isUserAdminObservable
.first((_, index) => index === 0, user => {
// do something here
// user.access_level;
return true;
})
}