嗨,我是Rxjs及其运算符的新手。
我很难理解下面的代码
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
const id = route.paramMap.get('id');
console.log('Entered in Can-Activate');
return this.store.select(policy)
.pipe(
tap(policy => {
console.log('-------------------' + JSON.stringify(policy));
if (policy.model.id !== id && policy.meta.loading !== 'progress') {
console.log('--------------dispaching-----');
this.store.dispatch(new Load(id));
}
}),
filter(policy => (
policy.model.id === id &&
(policy.meta.loading === 'done' || policy.meta.loading === 'failed')
)),
map(s => s.meta.loading ==='done'),
take(1)
);
}
为此的控制台输出是
Entered in Can-Activate
-------------------{"meta":{"loading":"start".........}
-------------------{"meta":{"loading":"progress".........}
-------------------{"meta":{"loading":"done".........}
有人能解释我为什么函数仅调用一次时下一行执行多次? console.log('-------------------'+ JSON.stringify(policy));
是因为ngrx存储还是RxJS运算符?
答案 0 :(得分:3)
this.store.select
是可观察的。
每次状态更改时,它将发出一个新值,并且tap
内部的逻辑将被执行,直到取消订阅为止。
在满足以下条件的情况下,
policy.model.id === id &&
(policy.meta.loading === 'done' || policy.meta.loading === 'failed')