如何在angular2服务调用中使用observable?

时间:2016-05-31 14:54:24

标签: angular rxjs

我有一个来自我的组件的服务调用,它获取了heroes.from该函数的列表,它调用另一个具有http请求的函数...我如何订阅函数调用以便我能正确获得响应......这是我的plunker演示http://plnkr.co/edit/UM9STMwaOsgolhBjADjx?p=preview ... 这就是我从我的组件中调用服务的方式

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

在我的Service类中,我调用了这个方法,该方法调用另一个具有http请求并订阅了该方法的方法...

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

最后这是获取列表的方法......

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

如果我直接从我的组件调用GetListOfHeroes()方法它工作正常,但如果我尝试从另一个方法调用它,它会显示此错误this.heroService.getHeroes(...).subscribe is not a function 有人请告诉我我做错了什么......谢谢

2 个答案:

答案 0 :(得分:2)

.map(...)中使用.subscribe(...)代替getHeroes(),如:

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

这种方式getHeroes()会返回Observable,而.subscribe()则会返回您无法订阅的Subscription

答案 1 :(得分: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' };
    });
}