this.ac-6ren">
gpt4 book ai didi

angular - 有没有办法在延迟运算符之后将流 "Cancel"

转载 作者:行者123 更新时间:2023-12-02 00:07:08 27 4
gpt4 key购买 nike

我在使用 NgRx 的 Angular 应用程序中使用轮询方案。

为了简化事情,我有如下内容:

    public stopPolling$ = createEffect(() => this.actions$.pipe(
ofType(actions.stopPolling),
tap(_ => this.isPollingActive = false),
map(_ => actions.stopPolling())
), { dispatch: false });

public continuePolling$ = createEffect(() => this.actions$.pipe(
ofType(actions.getData),
tap(_ => this.logger.debug('continue polling')),
delay(8000),
switchMap(_ => this.pollData())
), { dispatch: false });


private pollData() {
if (!this.isPollingActive)
return;
}

在我的“StopPolling”中我设置了一个标志,但是如果它在我处于 delay(8000) 时重新启动(即 isPollingActive 等回到 true),延迟将退出并且我将以多次调用 getData 结束。

所以,我的问题是,有没有一种方法可以在延迟之后调用 switchMap(_ => this.pollData()) - 即是否有某种方式“强制延迟到在超时期限之前退出”?

几乎(如果您了解 C#/.net)。就像 manualResetEvent.WaitOne(8000) 一样,可以通过对 manualResetEvent 对象调用 Set() 来取消。

最佳答案

您可以使用 timer 创建一个在延迟后发出的 observable,并使用 takeUntil 取消订阅以提早退出:

this.actions$.pipe(
ofType(actions.getData),
tap(_ => this.logger.debug('continue polling')),
switchMap(_ =>
timer(8000).pipe(
takeUntil(this.actions$.pipe(ofType(actions.stopPolling))),
concatMap(() => this.pollData())
)
)

这还可以让您消除副作用 this.isPollingActive = false 并确保控制流保持在可观察范围内。

关于angular - 有没有办法在延迟运算符之后将流 "Cancel",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60220897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com