我有一个来自我的组件的服务调用,它获取了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
有人请告诉我我做错了什么......谢谢
答案 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' };
});
}