【问题标题】:How to change HttpClient code after update app to Angular 7将应用程序更新到 Angular 7 后如何更改 HttpClient 代码
【发布时间】:2019-06-23 15:09:23
【问题描述】:

我在我的应用程序中将 Angular 更新到版本 7,我必须在更新后稍微更改我的代码,但我不知道该怎么做。

这是要更改的代码示例(在以前版本的 Angular 中):

get(): Observable<MyResponseClass | null> {
    let url_ = some_url;

    let options_: any = {
        method: "get",
        headers: new Headers({
            "Content-Type": "application/json",
            "Accept": "application/json"
        })
    };

    return this.http.request(url_, options_).flatMap((response_: any) => {
        return this.getResponse(response_);
    }).catch((response_: any) => {
        if (response_ instanceof Response) {
            try {
                return this.getResponse(<any>response_);
            } catch (e) {
                return <Observable<MyResponseClass | null>><any>Observable.throw(e);
            }
        } else
            return <Observable<MyResponseClass | null>><any>Observable.throw(response_);
    });
}

对于这个问题,getResponseMyResponseClass 是什么无关紧要,所以我将跳过解释。

好的,因此第一步是将 .flatMap 更改为 .pipe() 和 map() :

Observable 类型上不存在属性“flatMap”。

因此,在此更改之后,我的代码如下所示:

return this.http.request(url_, options_).pipe(map((response_: any) => { 
            return this.getResponse(response_); })
        ).catch((response_: any) => {
            if (response_ instanceof Response) {
                try {
                    return this.getResponse(<any>response_);
                } catch (e) {
                    return <Observable<MyResponseClass | null>><any>Observable.throw(e);
                }
            } else
                return <Observable<MyResponseClass | null>><any>Observable.throw(response_);
        });

现在我遇到了这样的错误:

“Observable>”类型上不存在属性“catch”。

这里我遇到了问题,因为我真的不知道我应该如何改变它。我仍在寻找谷歌和堆栈溢出的一些信息,但还没有成功。可能我对这方面的了解不够。

你会帮我解决这个问题吗?

【问题讨论】:

  • 你能return e;吗?

标签: angular angular7 angular-httpclient


【解决方案1】:

您的RxJS 很可能已从 v5.x 更新到 v6.x。因此,您需要重构涉及RxJS 的代码。

这里是更新指南:

https://github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/migration.md

【讨论】:

  • 这就是我要说的。在更新之前,您可能拥有以前的 RxJS 版本 (v5.x)。在你更新之后,它会抛出错误,因为函数定义和命名发生了变化。例如,catch 变为 catchError
  • 如果您仍然想帮助我,这是我的错误的延续:stackoverflow.com/questions/54441514/…
  • 有时间我一定会看看的。
  • 非常感谢!我将仍在寻找解决方案。
【解决方案2】:

Aa per rxjs V6 Update Guide chaining operators has been replaced by pipingcatch 更改为 catchError 所以你的最终代码应该是

  return this.http.request(url_, options_).pipe(map((response_: any) => { 
                return this.getResponse(response_); }),
              catchError((response_: any) => {
                if (response_ instanceof Response) {
                    try {
                        return this.getResponse(<any>response_);
                    } catch (e) {
                        return <Observable<MyResponseClass | null>><any>Observable.throw(e);
                    }
                } else
                    return <Observable<MyResponseClass | null>><any>Observable.throw(response_);
            })
            );

或者你可以使用rxjs-compact

【讨论】:

  • 我更新了我的问题,并在此更改后将错误放入问题内容中。我认为这不是改变的结束。
  • @Presto 这与您询问的问题无关。在此之后您可能会遇到更多错误以及无法在同一线程中回答的错误
  • 你是对的。我将问题回滚到以前的表单
  • 如果您仍然想帮助我,这是我的错误的延续:stackoverflow.com/questions/54441514/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2013-09-21
相关资源
最近更新 更多