#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
функции. Вызовет его с аргументами, вы просто указываете, какую функцию вызывать при возникновении ошибки.
Удачи!