【问题标题】:How to replace flatMap and mergeMap in rxjs 6.4.0 Angular如何在 rxjs 6.4.0 Angular 中替换 flatMap 和 mergeMap
【发布时间】:2019-07-09 21:58:51
【问题描述】:

我的 Angular 7 应用程序中有一个拦截器,它在重新发出请求之前请求获取令牌。如果多个请求同时进入,那么它们都会发出获取令牌的请求。为了避免我共享一个 observable,以便共享获取令牌的结果,并且只发出一个请求来获取令牌。

我按如下方式创建共享可观察对象

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;
            }));

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

【问题讨论】:

  • getRequestWithAuthentication如何抛出错误?可以分享一下代码吗?
  • 在上面的第一个代码 sn-p 中,您可以看到我如何捕获错误。你提到的方法只是调用return next.handle(req);。但是,我可以判断错误是由于身份验证请求还是由实际请求引起的。根据导致错误的原因,我做了一些不同的事情。

标签: angular rxjs rxjs6


【解决方案1】:

RxJS 5.5 引入了新的 pipe 运算符语法。在 RxJS 6.0 中,强制 使用旧语法。 所以你必须用

替换你的代码
.pipe(
    mergeMap(...)
)

【讨论】:

  • 如果我这样做......我该如何处理异常? return auth.sharedToken.pipe(mergeMap((res) => { gotToken = true; console.log('got token') auth.saveTokenToLocalStorage(res); return this.getRequestWithAuthentication(request, next, auth); })) ;
  • 您可能必须将 catchError 直接传递到嵌套的 observable 上,因此 this.getRequestWithAuthentication(request, next, auth).pipe(catchError...)
  • 这现在也被标记为已弃用,我找不到任何替代品。
猜你喜欢
  • 2018-09-16
  • 2019-01-31
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 2022-01-24
  • 2020-01-27
  • 1970-01-01
  • 2018-03-09
相关资源
最近更新 更多