cd Так что я пытаюсь перенести часть своего кода Angular 5 на 6, и я понимаю большинство изменений, необходимых для работы rxjs с использованием оператора .pipe (). Он работает так, как и следовало ожидать для «переносимых» операций.
Однако поведение 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
- это функция, которая принимает объект ошибки в качестве входных данных и анализирует ошибку ввода в более простой объект ошибок с нормализованным объектом. Улов возвращается 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: Тип 'Наблюдаемый <{} | Album []> 'нельзя назначить типу' Observable '
Как имитировать поведение старого оператора .catch()
?
Обновление:
После того, как мы немного поработали над этим, код, как показано, только начал работать, не давая мне ошибки сборки. Честно говоря, я понятия не имею, почему это не удалось с сообщением об ошибке раньше, но работает сейчас. Предложение @cartant в комментариях - это явный способ указать результат, который также работает.