angular - entre - Cómo devolver observables desde suscribirse.
que es un observable en angular (3)
Estoy intentando devolver un observable cuando obtengo un cierto valor en un suscriptor, pero fallo miserablemente.
Este es el código:
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
});
}
No hay muchos recursos sobre observables en angular 2, así que no sé por dónde empezar. ¿Alguien puede ayudar con esto por favor?
ACTUALIZACIÓN -> Versión de trabajo
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();
}
No necesita un mapa, el código a continuación especifica un predicado y una función de proyección para el primero.
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;
})
}
No puede devolver un observable desde la suscripción, pero si usa map
lugar de subscribe
, se devuelve un Observable
.
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;
}
Podemos convertir el objeto observable para prometer utilizando el método toPromise
. por lo que el código se puede implementar de la siguiente manera:
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();
}