반응형
구독에서 관찰 가능한 항목을 반환하는 방법
구독자에게 일정한 가치가 있을 때 관찰할 수 있는 것을 돌려주려고 하는데, 참담하게 실패합니다.
코드는 다음과 같습니다.
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
반응형
'IT' 카테고리의 다른 글
응답 유형에 적합한 HttpMessageConverter를 찾을 수 없습니다. (0) | 2023.08.06 |
---|---|
쿼리선택기 대 getElementBy이드 (0) | 2023.08.06 |
자바스크립트를 사용하여 페이지의 메타 태그를 변경할 수 있습니까? (0) | 2023.08.06 |
Controls 컬렉션에서 IEnumberable 메서드를 모두 제공하지 않는 이유는 무엇입니까? (0) | 2023.08.06 |
검색 뷰를 사용하여 Recycler 뷰를 필터링하는 방법 (0) | 2023.08.06 |