我有一个操作,它被调度以便在用户登录时加载数据。它被如下的效果捕获:
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操作同时运行。
1条答案
按热度按时间u5rb5r591#
你将不得不从
exhaustMap
改变为switchMap
(How to cancel http request with switchMap?),并额外使用一个可观测的接收取消信号。在您的例子中,这个observable的源将是一个选择器,它选择当前的身份验证状态。如果observable返回'logged in',则继续请求并返回Actions.loadedData
操作。如果observable返回'logged out',则返回Actions.noop
。