Ngrx轮询效果第二次停止工作



当我们开始轮询时,一切都如预期的那样工作。一旦我们停止并重新开始$ continuerfreshstudents停止工作。请查看stackblitz示例

复制步骤:

  1. 开始轮询(检查控制台日志,轮询继续)
  2. 停止轮询
  3. 开始第二次轮询(这次轮询没有继续)

https://stackblitz.com/edit/angular-ngrx-polling2?file=src%2Fapp%2Fstate%2Fapp.effects.ts

当您使用takeWhile时,一旦停止轮询将isPollingActive更改为false,它将完成您的效果中的可观察对象。ngrx不会在每次启动轮询时创建新的效果,因此后续的getDataSuccess动作效果不会发生。您可以将takeWhile更改为filter,这样您就可以忽略isPollingActive为假时的效果。

我不确定这是最好的方法,一个动作的效果会触发同样的动作再次发生。我觉得让开始动作创建一个可以触发继续动作的interval和停止动作停止interval会不那么混乱。

你可以将takeWhile移动到内部可观察对象(在mergeMap)管道中来解决这个问题,因为在这种情况下,一旦isPollingActive被改变,它将完成内部可观察对象,而不是主效果的可观察对象:

public continuePolling$ = createEffect(() =>
this.actions$.pipe(
ofType(appActions.getDataSuccess),
tap(data => console.log('app effect continue polling')),
takeWhile(() => this.isPollingActive),
delay(2000),
mergeMap(() =>
this.appDataSurvice.getData().pipe(
switchMap(data => {
return [appActions.getDataSuccess(data)];
}),
catchError(err => of(appActions.getDataFail(err))),
takeWhile(() => this.isPollingActive), // check again incase this has been unset since delay
)
)
)
);

最新更新