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>
的结果返回到管道中,这不是我想要的。从本质上讲,我只想像以前一样重新抛出任何错误。
错误TS2322:输入'Observable&lt; {} |相册[] GT;”不能分配给'Observable'
类型
如何模拟旧的运算符.catch()
行为?
更新
稍微改善了这一点后,显示的代码刚开始工作而没有给我一个构建错误。老实说,我不知道为什么它之前的错误消息失败了,但现在正在工作。 @cartant在评论中的建议是指定结果的明确方式,也是有效的。
答案 0 :(得分:14)
您应该能够明确指定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)
);
}
这样做会看到pipe
来电推断的类型为Observable<Album[]>
。