如何从订阅中返回 observable

新手上路,请多包涵

当我在订阅者中获得某个值时,我试图返回一个 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
        });
}

角度 2 中的 observables 资源并不多,所以我不知道从哪里开始。有人可以帮忙吗?

更新 - >工作版本

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

原文由 Dragos Ionescu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 596
2 个回答

您不能从 subscribe 返回 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;
}

原文由 Günter Zöchbauer 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您想订阅 observable,请执行此操作,处理结果,然后在订阅中返回相同的结果:

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

原文由 Zaslam 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进