IT

구독에서 관찰 가능한 항목을 반환하는 방법

itgroup 2023. 8. 6. 10:00
반응형

구독에서 관찰 가능한 항목을 반환하는 방법

구독자에게 일정한 가치가 있을 때 관찰할 수 있는 것을 돌려주려고 하는데, 참담하게 실패합니다.

코드는 다음과 같습니다.

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

각 2에 관측 가능한 자료가 별로 없어서 어디서부터 시작해야 할지 모르겠습니다.이것 좀 도와주실 분 있나요?

업데이트 -> 작업 버전

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

구독에서 관찰할 수 있는 항목을 반환할 수 없지만 다음을 사용하는 경우map대신에subscribe그 다음에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;
}

관찰 가능한 항목을 구독하려면 이 작업을 수행하여 결과를 처리한 다음 구독에서 동일한 결과는 다음과 같습니다.

function xyx(): Observable<any> { 
    const response = someFunctionThatReturnsObservable().pipe(map(result => {
          // here do any processing of the result //
          return result; // return back same result.
       }
    ))
   return response;
}

그냥 사용하면 안 될까요?pipe와 함께map부터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),
          ),
        ),
      );
  }
}

다음을 사용하여 관찰 가능 개체를 약속하도록 변환할 수 있습니다.toPromise방법.코드를 다음과 같이 구현할 수 있습니다.

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

맵이 필요하지 않습니다. 아래 코드는 먼저 술어와 투영 함수를 지정합니다.

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

먼저 자세히 보기

새 관찰 가능한 항목을 생성하고 다음에 따라 이벤트를 실행할 수 있습니다.access수평의

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
    // get route to be activated
    this.routeToActivate = route.routeConfig.path;

    // get user access levels
    return new Observable(subscriber=>{
       this._firebase.isUserAdmin
        .map(user => user.access_level)
        .subscribe(access => {
           // Return an observable!
           // Change your logic here...
           return access === XXX ? subscriber.next(true) : subscriber.next(false);
        }, err => subscriber.error());
    })
}

참조: https://rxjs-dev.firebaseapp.com/guide/observable

언급URL : https://stackoverflow.com/questions/39935721/how-to-return-observable-from-subscribe

반응형