为什么console.log会多次打印

时间:2020-06-25 22:14:43

标签: angular rxjs ngrx rxjs6 ngrx-store

嗨,我是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运算符?

1 个答案:

答案 0 :(得分:3)

this.store.select是可观察的。 每次状态更改时,它将发出一个新值,并且tap内部的逻辑将被执行,直到取消订阅为止。

在满足以下条件的情况下,

 policy.model.id === id &&
                    (policy.meta.loading === 'done' || policy.meta.loading === 'failed')