这是一个关于Angular 6和RXJS 6的答案。
在你的请求函数中,它会类似于这样。请注意,catch
已被替换为 catchError
,而 Observable.throw
现在可以用 throwError
替代。此外,在RXJS 6中,我们使用管道加入一系列我们希望执行的功能,而不是以前的点链接。
getData(url: string): Observable<any> {
let options = this.getHTTPOptions();
return this.http.get<any>(url, options).pipe(
catchError( (err: any, caught: Observable<any>) => { return
throwError(this.generalErrorHandler(err, caught)) } ) );
}
接下来您可以添加错误处理程序。关键是在上面的catchError
函数中指定关键字return
并在处理程序中返回错误。
箭头(=>
)允许您将调用函数的上下文传递到错误处理程序中,这意味着您可以执行很酷的操作,例如this.router.navigate(['someroute']);
(如果您已经在服务中导入了路由器)。
generalErrorHandler(error: any, caught: Observable<any>): Observable<any> {
console.log('error caught: ', error);
if( error.error.status == "INVALID_TOKEN" || error.error.status == "MAX_TOKEN_ISSUE_REACHED"){
console.log('token has expired');
this.logout();
return error;
}
return error;
}
让这个工作的一些关键导入:
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Http, Response } from '@angular/http';
import { catchError, map } from 'rxjs/operators';
import { Observable, throwError, of} from 'rxjs';
最后,订阅请求以获取您的数据:
let response$ = this.someService.getData('url here');
response$.subscribe(
data => { console.log('do stuff to data here', data); },
err => { console.log("couldn't get data, maybe show error to user"); },
() => { console.log('function that is called upon finish'); }
);
Observable.throwError
(而不仅仅是.throw
)。 - VSOProperty 'throwError' does not exist on type 'typeof Observable'. ts(2339)
(RxJS 7.4)的问题。throw
也出现了同样的情况。 - Jeremy Thille