当我们开始轮询时,一切都如预期的那样工作。一旦我们停止并重新开始$ continuerfreshstudents停止工作。请查看stackblitz示例
复制步骤:
- 开始轮询(检查控制台日志,轮询继续)
- 停止轮询
- 开始第二次轮询(这次轮询没有继续)
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
)
)
)
);