加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – 如何使用catchError()并仍返回带有rxJs 6.0的类型化O

发布时间:2020-12-17 10:19:09 所属栏目:安全 来源:网络整理
导读:cdSo我正在尝试将我的一些Angular 5代码迁移到6,并且我理解rxjs使用.pipe()运算符所需的大??多数更改.它的工作方式与“pipable”操作一样. 但是,catchError()的行为与.catch()运算符不同.在rxjs 6之前,我使用.catch()运算符将错误输入转换为一个一致的错误对
cdSo我正在尝试将我的一些Angular 5代码迁移到6,并且我理解rxjs使用.pipe()运算符所需的大??多数更改.它的工作方式与“pipable”操作一样.

但是,catchError()的行为与.catch()运算符不同.在rxjs 6之前,我使用.catch()运算符将错误输入转换为一个一致的错误对象,然后可以在`.subscribe()中捕获.

getAlbums(): Observable<Album[]> {
     return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
           .map(albumList => this.albumList = albumList)
           .catch(new ErrorInfo().parSEObservableResponseError);            
    }

new ErrorInfo().parSEObservableResponseError是一个函数,它将错误对象作为输入,并将输入错误解析为带有规范化对象的简单错误对象. Catch返回Observable< any>:

parSEObservableResponseError(response): Observable<any> {
    let err = new ErrorInfo();
    ...
    return Observable.throw(err);        
}

这对于轻松处理rxjs5错误非常有用 – 错误基本上被捕获为管道的一部分,然后抛出一个众所周知的错误结构,可以捕获.subscribe()错误函数.

然后将相同的代码移动到rxjs 6并使用.pipe()我尝试执行以下操作:

getAlbums(): Observable<Album[]> {
    return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
                .pipe(
                    map(albumList => this.albumList = albumList),catchError(new ErrorInfo().parSEObservableResponseError)                        
                );           
}

但是这不起作用,因为catchError现在返回Observable< any>的结果.进入管道,这不是我想要的.从本质上讲,我只想像以前一样重新抛出任何错误.

error TS2322: Type ‘Observable<{} | Album[]>’ is not assignable to type ‘Observable’

如何模拟旧的运算符.catch()行为?

更新:

经过多次讨论后,显示的代码刚开始工作而没有给我一个构建错误.老实说,我不知道为什么它之前的错误消息失败了,但现在正在工作. @cartant在评论中的建议是指定结果的明确方式,也是有效的.

您应该能够显式指定catchError的类型参数,以指示它不会返回发出值的observable – 也就是说,它将返回Observable< never> – 并将永远抛出:
getAlbums(): Observable<Album[]> {
    return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
        .pipe(
            map(albumList => this.albumList = albumList),catchError<Album[],never>(new ErrorInfo().parSEObservableResponseError)
        );           
}

这样做会看到从管道调用中推断出的类型是Observable< Album []>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读