Angular 5切换到HttpClient打破了我的服务

时间:2017-12-11 03:49:37

标签: javascript angular typescript observable angular5

在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,我甚至不需要服务。我在这里错过了什么吗?

2 个答案:

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