Обработка угловых ошибок с использованием catchError(somefunctionthatreturnsanobservable)

#angular #rxjs

#угловой #rxjs

Вопрос:

Просматривая документы Angular для обработки ответов об ошибках HTTP в сервисе, я наткнулся на что-то вроде этого:

 getContext(){
   return this.http.post(this.testUrl, {})
       .pipe(
           catchError(this.handleError)
       )
}

handleError(error: HttpErrorResponse){
    if(error.error instanceof ErrorEvent){
        console.log('An error occurred:', error.error.message);
    } else {
        console.log(
            `Backend returned code ${error.status}`  
            `body was ${error.error}`
        )
    }
    return throwError('Need to fix!');
}
 

Мне было интересно, почему this.handleError не передается аргумент (an HTTPErrorResponse ) и как он работает без его получения?

Комментарии:

1. catchError(this.handleError) здесь равно catchError(error => this.handleError(error))

2. @Kos Ах, я понимаю. Используется ли этот синтаксис, когда функции передается только один аргумент, который получает только один аргумент? Т.е. catchError(функция (ошибка){ this.HandleError(ошибка) })

3. да! Однако есть одно важное отличие: вызывающий контекст будет неопределенным при вызове like catchError(this.handleError) . Прочитайте это скорее как catchError(err => { const fn = this.handleError; return fn(err); }) . Здесь это больше не будет контекстом вызова, контекст будет пустым. Таким образом, вы не сможете ссылаться this на handleError метод.

4. @Kos Понял! Спасибо.

5. О том, как правильно использовать rxjs, я могу порекомендовать две статьи: medium.com/@alexanderposhtaruk /… и blog.angularindepth.com /…

Ответ №1:

handleError Метод передается как обратный catchError вызов .

 doSomething(callback) {
    // Call the callback with arguments
    callback('Hello world');
}
 
 saySomething(param) {
   console.log(param);
}
 
 doSomething(saySomething);
 

Попробуйте представить catchError , что делает то же самое для вашей handleError функции. Вызовет его с аргументами, вы просто указываете, какую функцию вызывать при возникновении ошибки.

Удачи!