RxJs:具有内部 observable 的过滤器数组 [英] RxJs: Filter array with inner observable
问题描述
我有一组路由,我试图根据服务是否表示用户具有权限来过滤这些路由.我尝试了各种组合 &没有成功的转换运算符 mergeMap、concatMap、concatAll、mergeAll
.问题是 hasRoutePermission
返回一个 observable,它从端点返回一个布尔值.提前致谢.
I have an array of routes, which I'm trying to filter on depending if the service says the user has permission. I've tried various combination & transformative operators with no success mergeMap, concatMap, concatAll, mergeAll
. The problem is that hasRoutePermission
returns an observable that returns a boolean from the endpoint. Thanks in advance.
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
)
}
我正在使用异步管道订阅模板中的过滤列表.
I'm using an async pipe to subscribe to the filtered list in the template.
推荐答案
因此您在 Observable 中接收布尔值,现在需要使用扁平化"之一操作符(如 mergeMap
、concatMap
等)来获取原始值:
So you receive boolean value inside Observable and now need to use one of "flattening" operators (like mergeMap
, concatMap
, etc) to get back primitive value:
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>
这篇关于RxJs:具有内部 observable 的过滤器数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!