Как я могу использовать catchError () и по-прежнему возвращать типизированный Observable с rxJs 6.0? - PullRequest
0 голосов
/ 09 мая 2018

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 в комментариях - это явный способ указать результат, который также работает.

1 Ответ

0 голосов
/ 09 мая 2018

Вы должны иметь возможность явно указать параметры типа для catchError, чтобы указать, что он не вернет наблюдаемую информацию, которая испускает значение, то есть вернет 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[]>.

...