Angular4从Http迁移到HttpClient

时间:2017-09-07 02:05:37

标签: angular typescript angular4-httpclient

我正在迁移我的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()并以与我已经在做的相同的方式处理数据?

提前致谢!

1 个答案:

答案 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;
        });
}