在Angular 5之前,我们从Http
导入并使用了@angular/http
。现在我们使用HttpClient
中的@angular/common/http
。添加了一定程度的便利性,因为每当我们使用.map(res => res.json())
拨打电话时,我们都不需要将所有响应数据转换为JSON格式的不必要步骤。但是,现在我们不打算使用.map
。我们假设直接进入.subscribe()
。再次,这被认为是方便的。但是,在将数据返回到其他组件中的订阅函数之前,我曾经在我的服务中执行一些逻辑,我的API调用了。例如,
组件:
getData(id) {
this.service.getDataFromApi(id).subscribe(res => this.doSomething(res));
}
服务:
public getDataFromApi(id) {
if (this.data.length > 0) {
return Observable.of(this.data);
} else {
return this.http.get(this.apiPath + id)
.map((response: any) => {
this.data = response.json();
return this.data;
});
}
}
现在,他们建议我们将服务调用缩短为以下内容:
public getDataFromApi(id) {
if (this.data.length > 0) {
return Observable.of(this.data);
} else {
return this.http.get(this.apiPath + id);
}
}
我不认为使用.map
因为将来不再支持它。在返回数据之前如何做一些逻辑?我不想打电话给已经存在且不会改变的一些数据。多个组件正在使用此服务。我想在解决之前将每个服务调用转换为原始承诺并运行一些逻辑吗?如果我只是在组件的功能上调用subscribe,我甚至不需要服务。我在这里错过了什么吗?
答案 0 :(得分:2)
您可以使用map
。新的HttpClient增加了将响应类型默认为JSON的便利性,但它仍返回Observable
- 并且没有计划从Observable API中弃用map
。
因此,您的代码只需要稍加修改(取出.json()
):
public getDataFromApi(id) {
if (this.data.length > 0) {
return Observable.of(this.data);
} else {
return this.http.get(this.apiPath + id)
.map((response: any) => {
this.data = response;
return this.data;
});
}
}
请参阅Observable API文档here。
答案 1 :(得分:1)
如果您使用新的HttpClient,则没有res.json方法。它会自动运行,只需传递响应类型:
return this.http.get(this.apiPath + id)
.toPromise()
.then(data => {
console.log(data)
return data
});