typescript 有谁能在Angular中解释rxjs中的exhaustMap吗?

fruv7luv  于 2023-10-22  发布在  TypeScript
关注(0)|答案(2)|浏览(97)
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里面发生了什么。

lrpiutwd

lrpiutwd1#

假设这段代码this.authService.emitUser(称为source observable)发出了一个用户,比如说Theri,并且正在exhuastMap中处理,而如果source observable发出了另一个用户Muthu,则exhaustMap仍然倾向于处理用户Theri,直到完成。处理完后,用户Theri只会开始处理用户Muthu

8hhllhi2

8hhllhi22#

exhaustMap是一个高阶管道操作符,它订阅管道化的observable,并且对于(几乎)每个发出的值,返回一个新的observable,来自您传递给它的函数。
但是如果返回的observable还没有完成,但是源observable发出了一个新值,会发生什么呢?这就是exhaustMapswitchMapconcatMapmergeMap的区别。
在你的例子中,使用了exhaustMap,这意味着如果一个新的值来自源observable,但是之前Map的observable还没有完成,那么来自源observable的新值将被忽略。
它将被忽略,直到先前返回的observable完成。在此之后,来自源可观察值的新值将再次Map到内部可观察值。

相关问题