可观察定时器:定时器结束后返回动作



我正试图在React应用程序中使用rxjs中的计时器创建一个简单的轮询工作程序。

为此,我创造了一部史诗。非常简单-我在1分钟内每5秒从服务器获得一些信息。

const processPollEpic = action$ => action$.pipe(
ofType(POLL_START),
mergeMap(() => timer(0, 5000).pipe(
exhaustMap(() => from(service.getSmth()).pipe(map(resp => {
if (resp.isSuccess) {
return processPollStop();
}
return processPollContinue();
}))),
takeUntil(action$.ofType(POLL_STOP)),
take(12),
)),
);

它做得很好,但我解决不了一个角落的案子。现在,只有当服务器的响应成功时,我才会返回POLL_STOP操作。但当时间结束时,我什么也不做。

计时器结束时,我可以返回一些操作吗?

您可以拆分mergeMap:内部的内链

concat(
timer(0, 5000).pipe(
exhaustMap(() => from(service.getSmth()).pipe(map(resp => {
if (resp.isSuccess) {
return processPollStop();
}
return processPollContinue();
}))),
take(12),
),
of(CREATE_OTHER_ACTION_HERE),
).pipe(
takeUntil(action$.ofType(POLL_STOP)),
)

CCD_ 2将仅在上一个链已经完成之后订阅CCD_ 3。那么takeUntil仍然可以完成整个链,所以concat将从其内部Observable中取消订阅。

顺便说一句,请确保从'rxjs'而不是从'rxjs/operators'导入正确的concat

最新更新