angular - RxJs:具有内部可观察的过滤器数组
问题描述
我有一系列路线,我试图根据服务是否说用户有权限来过滤这些路线。我尝试了各种组合和变革运营商,但都没有成功mergeMap, concatMap, concatAll, mergeAll
。问题是hasRoutePermission
返回一个从端点返回布尔值的可观察对象。提前致谢。
const exampleRoutes = [{
model: 'ExampleModel'
}, {
model: 'ExampleModel'
}, {
model: 'ExampleModel'
}, {
model: 'ExampleModel'
}];
filterRoutes(routes): Observable <[]> {
const hasRoutePermission = (route: IRouteData): Observable <boolean> =>
this.examplePermissionService.hasRoutePermission(route);
return of(items)
.pipe(
filter(item => hasRoutePermission(item))// Problem is here
)
}
我正在使用异步管道订阅模板中的过滤列表。
解决方案
因此,您在 Observable 中接收布尔值,现在需要使用“扁平化”运算符之一(如mergeMap
、concatMap
等)来取回原始值:
const { of, from } = rxjs; // = require("rxjs")
const { mergeMap, filter, map, toArray } = rxjs.operators; // = require("rxjs/operators")
function hasRoutePermission(id) {
return of(id % 2 === 0); // mock api logic
}
function filterRoutes(items) {
return from(items).pipe(
mergeMap(item =>
hasRoutePermission(item).pipe(
filter(permission => permission),
map(() => item)
)
),
toArray()
);
}
const filtered$ = filterRoutes([0,1,2,3,4,5]);
filtered$.subscribe(v => console.log(v));
<script src="https://unpkg.com/rxjs@6.6.2/bundles/rxjs.umd.min.js"></script>
推荐阅读
- sql-server - SSIS 包需要很长时间或最终失败
- php - 如何使结帐帐单字段在 Woo Commerce 中只读
- php - 获取mysql和php的平均购买价格
- vba - 如何在函数中返回 Outlook GetExchangeUser 对象
- javascript - 我想在 chrome 扩展中打开一个 tensorflow 模型,但它似乎不起作用
- javascript - 在复选框更改数据表中文本框的值
- node.js - 如何在 MongoDB 中仅获取数组元素而不是整个对象作为输出?
- three.js - 如何在three.js中高效地创建管子
- c++ - 带持续时间的直接输入开始效果
- uwp - 使用模板样式的 UWP 中按钮的不同边框颜色