angular - 我如何确保只有一个呼叫与角度拦截器同时进行?
问题描述
角度拦截器如下所示:
public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
catchError(err => {
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
this.auth.getToken().subscribe((refreshOk: boolean) => {
if (!refreshOk) {
this.router.navigate(["/login"]);
}
});
}
}
return Observable.throw(err);
})
);
问题是一次进行了四个不同的 api 调用。所以四个 getToken 调用是同时进行的。一个电话就够了。如何确保一次只拨打一个电话?
解决方案
在您进行 api 调用的地方,您可以使用race
observable 并将您的 api 调用放入其中。第一个响应的获胜,其他的则被拒绝。
// RxJS v6+
race(
api.get('http://abc/foo'),
api.get('http://abc/bar'),
api.get('http://abc/baz'),
);
// RxJS v5
Observable.race(
api.get('http://abc/foo'),
api.get('http://abc/bar'),
api.get('http://abc/baz'),
);
推荐阅读
- vba - 当表格中的单元格不为空时添加行
- c++ - 输出字符串数组
- inform7 - If statement won't work in Inform 7
- java - Android Studio Gradle Daemon - java.net.BindException: Address already in use: bind
- python - Image processing - eliminate arc-like smears
- reactjs - React.createRef always null
- swift - Occasional stuttering with SceneKit when touching the screen
- android - Is it possible to use 2 Crashlytics API keys?
- javascript - How to pass function in another file in React
- java - Public Key Generation from .cer file not working on Android 28