首页 文章

从嵌套的observable返回observable

提问于
浏览
0

我试图从一个来自一个observable的响应中返回一个布尔observable,该observable位于父observable的响应中 . 但是,子观察值并不总是依赖于父观察者的res .

我知道要做这项工作我必须使用.map并且我可以在订阅中返回observable但是之后我感到难过 .

方案是我进行身份验证检查是否通过,然后执行api调用,如果失败则返回false . 如果api调用失败则返回false,如果成功则返回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()可用 .

1 回答

  • 3

    我想你需要使用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);
       }
    );
    

相关问题