如何在rxjs 6.4.0 Angular中替换flatMap和mergeMap

时间:2019-02-15 17:58:29

标签: angular rxjs rxjs6

我的Angular 7应用程序中有一个拦截器,该拦截器在重新发出请求之前发出获取令牌的请求。如果一次有多个请求,那么它们都会发出请求以获取令牌。为了避免这种情况,我共享一个可观察的对象,以便共享获取令牌的结果,并且只提出一个获取令牌的请求。

我如下创建共享的可观察对象

this.authService.sharedToken =   this.authService.getToken().pipe(share());

然后我发出请求

 return auth.sharedToken.flatMap((res) => {

     auth.saveTokenToLocalStorage(res);
     return this.getRequestWithAuthentication(request, next, auth);

 }).catch(function (err) {// I handle errors here
 }

问题是不建议使用flatMap,而将其替换为mergeMap也不起作用。似乎mergeMap现在是一个独立的函数。那么我如何才能使上面的代码正常工作。

我正在使用rxjs 6.4.0 和Angular 7.2.4

谢谢。

编辑:

使用新管道方法,我有以下内容:

  return auth.sharedToken.pipe(
            mergeMap((res) => {

                auth.saveTokenToLocalStorage(res);
                return this.getRequestWithAuthentication(request, next, auth);
            }), catchError(function (err) {
                console.log("failed to get token")
                return EMPTY;
            }));

当请求失败时,我无法打印“无法获取令牌”。我在那里做更多的错误处理,因此我需要在请求失败时触发一些代码。

1 个答案:

答案 0 :(得分:1)

使用 RxJS 5.5 引入了新的 pipe 运算符语法。在 RxJS 6.0 中,使用旧语法已成为强制。 因此,您必须将代码替换为

.pipe(
    mergeMap(...)
)