2016-05-31 95 views
1

我有一個來自我的組件的服務調用,該組件獲取了heroes.from該函數的名稱,它調用了具有http請求的另一個函數...我如何訂閱函數調用,以便我將得到正確的響應。 ..Here是我plunker演示http://plnkr.co/edit/UM9STMwaOsgolhBjADjx?p=preview ... 這就是我如何調用從我的組件如何在angular2服務調用中使用observables?

ngOnInit() { 
       this.heroService.getHeroes() 
       .subscribe(
        heroes => this.heroes = heroes, 
        error => this.errorMessage = <any>error); 
} 

而在我的服務一流的服務,我稱這種方法,它調用具有HTTP請求和簽署的另一種方法到...

getHeroes(){ 
return this.GetListOfHeroes() 
     .subscribe((data: any) => { 
      return data; 
     } 
     ); 
} 

最後,這個我S的獲取列表的方法...

GetListOfHeroes(){ 
    return this.http.get(this.heroesUrl) 
       .map(this.extractData) 
       .catch(this.handleError); 
} 

如果我直接打電話從我的組件GetListOfHeroes()方法,它工作正常,但如果我試圖調用,從另一種方法它表明這個錯誤this.heroService.getHeroes(...).subscribe is not a function 有人請告訴我在哪裏做錯了......謝謝

回答

2

使用.map(...)而不是.subscribe(...)getHeroes(),如:

getHeroes(){ 
    return this.GetListOfHeroes() 
    .map((data: any) => { 
     return data; 
    }); 
    } 

這樣,當與.subscribe()它返回一個Subscription你不能訂閱getHeroes()返回Observable

1

事實上,你應該在getHeroes方法中訂閱,因爲它會返回訂閱而不是可觀察的。

getHeroes(){ 
    return this.GetListOfHeroes() 
    .subscribe((data: any) => { // <----- 
     return data; 
    }); 
} 

subscribe方法只能在observable上調用。訂閱對象可用於取消訂閱...

實際上,這取決於您想要在getHeroes方法中執行的操作。例如,您可以利用do運營商或map。下面是一個示例:

getHeroes(){ 
    return this.GetListOfHeroes() 
    .do((data: any) => { // <----- 
     // do something with data 
    }) 
    .map((data: any) => { 
     // return something else in the data flow 
     return { attr: 'value' }; 
    }); 
} 
相關問題