我正在迁移我的Angular应用程序现在使用新的HttpClient但是我遇到了一些问题,以达到与Http相同的结果。希望你们能帮助我。
所以这就是我用Http做的事情:
getAll() {
return this.http.get(environment.API_DOMAIN + environment.CURRENCY_API_URL).map(res => {
let response: ICurrenciesResponse = <ICurrenciesResponse> res.json();
response.result = <Currency[]> res.json().result.map(service => {
return new Currency(<ICurrency> service);
});
return response;
});
}
使用界面ICurrenciesResponse女巫键入响应:
import { IGenericResponse } from '../igeneric-response';
import { Currency } from '../../classes/currency';
export interface ICurrenciesResponse extends IGenericResponse {
result?: Currency[]
}
正如您所看到的,接口扩展了IGenericResponse,并由Currency数组组成,这是一个已定义的类。为了正确设置这个数组,我必须在secound map中创建一个新的Currency对象。这非常有效,到目前为止我对这种方法非常满意。
知道,当我迁移到HttpClient时,我有这个:
getAll(): Promise<ICurrenciesResponse> {
return this.http
.get<ICurrenciesResponse>(environment.API_DOMAIN + environment.CURRENCY_API_URL)
.toPromise();
}
但是我知道我的货币数组没有正确设置为货币数组。是不是HttpClient假设根据get方法中定义的类型接口来转换数据? 如果没有,那么实现与Http相同的最佳方式是什么?使用subscribe()代替toPromisse()并以与我已经在做的相同的方式处理数据?
提前致谢!
答案 0 :(得分:0)
HttpClient
尝试为响应找到正确的内容类型,而不是根据响应中的数据为您创建实例。
您仍然必须使用map
运算符并在其中创建实例。但您必须删除.json()
来电。
getAll() {
let url = environment.API_DOMAIN + environment.CURRENCY_API_URL;
return this.http
.get<ICurrenciesResponse>(url)
.map(response => {
if(Array.isArray(response.result) {
response.result = response.result.map(service => new Currency(service));
}
return response;
});
}