que entre ejemplo datos comunicacion componentes compartir angular rxjs observable

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; }) }

Más sobre primero


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(); }