redux 如果用户已注销,如何取消执行ngrx效果

aamkag61  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(105)

我有一个操作,它被调度以便在用户登录时加载数据。它被如下的效果捕获:

getData$ = createEffect(() =>
    this.actions$.pipe(
      ofType(Actions.getData),
      exhaustMap(() => {
        return this.apiService.getData().pipe(
          map(result => {
            // Update state with loaded data
            return Actions.loadedData({
              data: result,
            });
          }),
          catchError(errorRes => {
             // Handle error
          })
        );
      })
    )
  );

当用户注销时,我想重置状态,所以我添加了一个操作,在调度时将状态重置为初始状态。但下面的序列提出了一个问题:
1.用户登录,调度加载数据的操作
1.行动被效果捕捉,发出服务呼叫
1.用户注销,发送重置状态的操作并重置状态
1.服务调用返回,并调度loadedData以使用数据更新状态
由于在分派注销操作并重置状态时效果正在运行,因此将调用loadedData操作以使用数据更新状态。如果用户已经注销,我如何避免服务调用和随后的loadedData操作同时运行。

u5rb5r59

u5rb5r591#

你将不得不从exhaustMap改变为switchMapHow to cancel http request with switchMap?),并额外使用一个可观测的接收取消信号。在您的例子中,这个observable的源将是一个选择器,它选择当前的身份验证状态。如果observable返回'logged in',则继续请求并返回Actions.loadedData操作。如果observable返回'logged out',则返回Actions.noop

相关问题