import {
HttpHandler,
HttpInterceptor,
HttpParams,
HttpRequest,
} from '@angular/common/http';
import { Injectable } from '@angular/core';
import { exhaustMap, take } from 'rxjs/operators';
import { AuthenticationService } from './authentication.service';
@Injectable()
export class AuthInterceptorService implements HttpInterceptor {
constructor(private authService: AuthenticationService) { }
intercept(req: HttpRequest<any>, next: HttpHandler) {
return this.authService.emitUser.pipe(
take(1),
exhaustMap((user) => {
if (!user) {
return next.handle(req);
}
const modifiedReq = req.clone({
params: new HttpParams().set('auth', user!.token!),
});
return next.handle(modifiedReq);
})
);
}
}
这是一个拦截器文件,它通过添加'auth'查询参数和一个值来修改请求URL,该值作为我们从这里的user对象获得的令牌。但我不明白exhaustMap里面发生了什么。
2条答案
按热度按时间lrpiutwd1#
假设这段代码
this.authService.emitUser
(称为source observable
)发出了一个用户,比如说Theri,并且正在exhuastMap
中处理,而如果source observable
发出了另一个用户Muthu,则exhaustMap
仍然倾向于处理用户Theri,直到完成。处理完后,用户Theri只会开始处理用户Muthu。8hhllhi22#
exhaustMap
是一个高阶管道操作符,它订阅管道化的observable,并且对于(几乎)每个发出的值,返回一个新的observable,来自您传递给它的函数。但是如果返回的observable还没有完成,但是源observable发出了一个新值,会发生什么呢?这就是
exhaustMap
,switchMap
,concatMap
和mergeMap
的区别。在你的例子中,使用了
exhaustMap
,这意味着如果一个新的值来自源observable,但是之前Map的observable还没有完成,那么来自源observable的新值将被忽略。它将被忽略,直到先前返回的observable完成。在此之后,来自源可观察值的新值将再次Map到内部可观察值。