How to return observable from subscribe How to return observable from subscribe angular angular

How to return observable from subscribe


You can't return an observable from subscribe but if you use map instead of subscribe then an Observable is returned.

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


Couldn't we just use pipe with map from import { map } from 'rxjs/operators';?

import { map } from 'rxjs/operators';@Injectable({  providedIn: 'root'})export class SearchHostService {  constructor(private readonly http: HttpClient) {}  searchForHosts(searchString: string): Observable<Employee[]> {    return this.http      .get<Employee[]>('./assets/host-users.json')      .pipe(        map(employees =>          employees.filter(({ displayName }) =>            displayName.toLowerCase().startsWith(searchString),          ),        ),      );  }}


We can convert the Observable object to promise using toPromise method.so the code can be implemented as followed:

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