Dra*_*scu 46 observable rxjs typescript angular
当我在订阅者中获得某个值时,我正试图返回一个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.isUserAdmin <-- returns Subscription, not Observable
.map(user => user.access_level)
.subscribe( access => {
// I need to return an observable here
});
}
Run Code Online (Sandbox Code Playgroud)
角度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();
}
Run Code Online (Sandbox Code Playgroud)
Gün*_*uer 72
你不能从订阅中返回一个observable但是如果你使用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;
}
Run Code Online (Sandbox Code Playgroud)
我们不能只使用pipewith mapfromimport { 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),
),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以使用toPromise方法将 Observable 对象转换为 promise 。所以代码可以实现如下:
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();
}
Run Code Online (Sandbox Code Playgroud)
如果要订阅 observable,请执行此操作,处理结果然后在 subscribe 中返回相同的结果:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48195 次 |
| 最近记录: |