如何终止@ ngrx / effects中的管道操作?

时间:2018-08-29 07:23:19

标签: angular google-cloud-firestore ngrx-store ngrx-effects

在下面的代码中,我从Firestore获得了集合的长度。

clickReload(id: number) {
    if(id == this.activatedRoute.snapshot.params.id) {
        window.location.reload();    //if id is same then just reload the page
    } else {
        this.router.navigate(['article', id]);
    }
}

@ ngrx / effects按如下方式访问此方法

getUserCartLength(uid:string){
    return this.db.collection('users/'+uid+'/cart').valueChanges()
        .pipe(
            map(docs=>{return docs.length})
        )
}

在组件中,我正在使用store方法在检查用户是否存在后调度动作

@Effect()
userExist$ = this.actions$.ofType(UserAuthTypes.YES_USER_EXIST).pipe(
    map((action:YesUserExist)=>action.user),
    switchMap((user)=>{
        return this.userService.getUserCartLength(user.uid)
                .pipe(
                    map(length=>{
                        console.log(length);
                        return new InitializeUserCart(length);
                    })
                )
    }),
)

只要用户登录,一切正常。用户注销后,将引发如下错误

ngOnInit() {
  this.logService.isUserExist().subscribe(user=>{
      if(user) this.store.dispatch(new fromUser.YesUserExist(user));
      else this.store.dispatch(new fromUser.NoUser());
  })
}

我对此错误的理解是,管道操作仍在尝试访问数据库

是否有任何方法可以关闭ngrx / effects中的管道操作或任何其他方法,请帮帮我!

1 个答案:

答案 0 :(得分:0)

何时从switchMap到另一个stream1进行stream2-仔细检查您是否真的想听除第一个动作之外的每个stream2动作。

似乎解决方案是在效果中向内部流添加first()