Return 可从嵌套可观察对象中观察到

Return observable from nested observable

我正在尝试 return 从响应中得到一个布尔值可观察值,该响应是我从父可观察值的响应中的可观察值得到的。但是子 observable 并不总是 运行 取决于父 observable 的资源。

我知道要完成这项工作,我必须使用 .map 并且我可以 return 订阅中的可观察对象,但在那之后我感到很困惑。

场景是我进行身份验证检查是否通过,如果失败则执行 api 调用 return false。如果 api 调用失败 return false,如果成功 return true。

    getEvents(): Observable<boolean> {
       this.authSrvc.authCheck().map((res: boolean) => {
          if (res) {
                this.eventsSrvc.getEvents(this.pageNum, this.pageSize, this.searchText).timeout(15000).map((data: Response) => data.json()).subscribe((res:any)=>
                {
                    if(res.value.length === 0)
                    {
                        Observable.of(false);
                    }
                    else
                    {
this.eventsList = this.eventsList.concat(data);

                        this.storage.ready().then(() => {
                            this.storage.set('events', this.eventsList)
                        })
                        Observable.of(true);


                    }
                },(err:any)=>
                {

                    this.helperSrvc.errorMessage(err);
  return Observable.of(false);
                })
            }
            else {
this.helperSrvc.authFailed();
                this.authSrvc.logout();
                this.pushSrvc.unRegisterPush();
                this.calendarSrvc.clearEvents();
                this.locationSrvc.clearGeofences();
                this.navCtrl.setRoot(AuthPage);
                return Observable.of(false);
               // 
            }
        })
    }

我要么无法得到响应,要么被告知调用此函数的函数没有可用的 .subscribe()。

我认为你需要使用 flatMap,我已经更改了下面的代码。

getEvents(): Observable<boolean> {
return this.authSrvc.authCheck().flatMap((res: boolean) => {
  if (res) {
    return this.eventsSrvc.getEvents(this.pageNum, this.pageSize, this.searchText)
    .timeout(15000)
    .map((data: Response) => data.json())
    .flatMap((res: any) => {
      if (res.value.length === 0) {
        return Observable.of(false);
      }
      else {
        this.eventsList = this.eventsList.concat(data);

        this.storage.ready().then(() => {
          this.storage.set('events', this.eventsList);
        });
        return Observable.of(true);
      }
    });
  }
  else {
    return Observable.of(false);
    // 
  }
})
}

编辑:我删除了您的错误处理程序,您需要在订阅 getEvents 时传递它。

getEvents().subscribe(
   (res:boolen) => {},
   (err:any)=>{
      this.helperSrvc.errorMessage(err);
   }
);