angular - 如何在 rxjs 6.4.0 Angular 中替换 flatMap 和 mergeMap
问题描述
我的 Angular 7 应用程序中有一个拦截器,它在重新发出请求之前请求获取令牌。如果多个请求同时进入,那么它们都会发出获取令牌的请求。为了避免这种情况,我共享了一个 observable,以便共享获取令牌的结果,并且只发出一个请求来获取令牌。
我按如下方式创建共享的 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;
}));
当请求失败时,我无法打印“获取令牌失败”。我在那里做了更多的错误处理,所以我需要在请求失败时触发一些代码。
解决方案
RxJS 5.5引入了新的管道运算符语法。在RxJS 6.0中,强制使用旧语法。因此,您必须将代码替换为
.pipe(
mergeMap(...)
)
推荐阅读
- types - 堆栈条目的类型(在虚拟机中)
- matlab - 找到最短路径的更快方法是什么?
- node.js - 如何在 Linux 上永远在后台运行程序
- javascript - Echarts -> 堆叠独立柱
- spring - 来自 Inetutilsproperties 的 Spring bean 创建异常
- javascript - 获取焦点输入文本的值,将其连接到数据值,单击时将获取结果+ jquery
- javascript - 将光标自动从数字输入字段移动到下一个字段
- c# - 在 Entity Framework 6+ 的两个上下文中使用一个实体
- javascript - 条件逻辑运算符未按预期执行
- c# - 组加入 3 表时的问题