所以我刚才知道我不能在使用异步操作的函数中使用return语句,或者我可以,但我使用它不正确。我的想法是,我应该在我想要使用我正在抓取的数据的地方订阅obseravable,而不是仅仅在那个地方调用函数并使用return语句。
这是我的代码什么是更好的做事方式所以我不必使用return语句,或者更好的是,我怎么还能使用return语句。请注意我想使用observables,而不是promises,我不再看到promises中的值。
谢谢。
getService(url) {
var value: any[] = [];
this.http.get(url)
.map(
(response: Response) => {
const data = response.json()
.subscribe(
(mappedData: any[]) => value = mappedData,
(error) => console.log(error)
)
}
);
return value;
}
答案 0 :(得分:0)
我们可以这样返回json对象的值。
getService(url) {
var value: any[] = [];
var subscription = this.http.get(url)
.map(response => response.json() )
.subscribe(
mappedData => value = mappedData.data,
(error) => console.log(error)
);
return value; }
http.get()
.map()
转换为json对象
.subscribe()
到.map()的输出,这是转换后的json对象value
..返回值请仔细阅读angular documentation以便更好地理解。
答案 1 :(得分:0)
根据我的理解:
getService(url) {
var value: any[] = []; // (1)
this.http.get(url) // (2)
.map(response => response.json() ) // (3)
.subscribe( // (4)
mappedData => value = mappedData.data, // (5)
(error) => console.log(error) // (6)
);
return value; // (7)
}
调用getService()
函数时......
第1行执行并将值设置为空数组。
第2行执行,执行Http get操作并设置Observable。
第7行执行,返回现在仍为空的数组。
在某些时间点,当从服务器返回响应时......
第3行执行将响应映射到JSON对象并将其提供给subscribe方法
第5行执行,将本地值属性分配给mappedData的data属性,并且由于外部函数已经返回了该属性...所以没有对结果值进行任何操作。
这就是我理解这段代码的方式。如果我错了,请纠正我。
先前答案中引用的文档实际上显示的代码如下:
在名为HeroService
的角色服务中:
getHeroes(): Observable<Hero[]> {
return this.http.get(this.heroesUrl)
.map(this.extractData)
.catch(this.handleError);
}
请注意,这是返回Observable ...而不是属性。并且组件中的调用代码包括subscribe方法:
在名为HeroComponent
的角色组件中:
getHeroes() {
this.heroService.getHeroes()
.subscribe(
heroes => this.heroes = heroes,
error => this.errorMessage = <any>error);
}
答案 2 :(得分:0)
getService(url) {
var value: any[] = [];
var subscription = this.http.get(url)
.map(response => response.json() )
subscription.subscribe(
mappedData => value = mappedData.data,
(error) => console.log(error)
);
return value; }