2017-03-15 74 views
0

我想从一个响应中得到的响应返回一个布尔可观测值,这个响应来自于父可观察值响应内部的可观测值。但是,可观察孩子不会总是依赖于父亲可观察到的资源。从嵌套可观测值返回可观测值

我知道要做这项工作,我必须使用.map,并且我可以在订阅中返回observable,但在此之后我难倒了。

这种情况是,我做了一个auth检查,如果通过,然后执行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()可用。

回答

2

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