redux-observable 和 RxJS 有哪些选择
What alternatives are there to takeUntil with redux-observable and RxJS
我已经开始将一些异步逻辑移植到 redux-observables,但我对此有些吃力。
我的用例是这样的:
我有一个 UI 叠加层,它应该在 OPEN_OVERLAY
操作时打开,并在三秒后自动关闭(通过发出 CLOSE_OVERLAY
),除非 INTERRUPT_CLOSE_OVERLAY1
或 INTERRUPT_CLOSE_OVERLAY2
收到操作,在这种情况下,覆盖不应关闭。
我的第一个镜头是这样的:
export const epic = action$ => action$.pipe(
filter(action => action.type === "OPEN_OVERLAY"),
delay(3000),
takeUntil(action$.ofType("INTERRUPT_CLOSE_OVERLAY1", "INTERRUPT_CLOSE_OVERLAY2")),
mapTo({type: "CLOSE_OVERLAY})
);
哪个有效,但只有一次。也就是说,如果你打开覆盖并中断它,那么在关闭并再次打开它之后它永远不会 auto-close.
我知道发生这种情况是因为 takeUntil
实际上取消了对 Observable 的订阅。但是我用 redux-observables 理解它的方式你只在设置时定义一次史诗而且你不应该是 subscribing/unsubscribing.
那么,我将如何构建 open/close/autoclose 无需取消订阅就始终有效的结构?
这是我的方法:
actions$.pipe(
filter(action => action.type === "OPEN_OVERLAY"),
switchMap(
() => timer(3000)
.pipe(
mapTo({ type: "CLOSE_OVERLAY" }),
takeUntil(action$.ofType("INTERRUPT_CLOSE_OVERLAY1", "INTERRUPT_CLOSE_OVERLAY2")),
)
)
)
它在"OPEN_OVERLAY"
发射时启动定时器,然后如果提供给takeUntil
的observable在此期间没有发射,它将成功发射"CLOSE_OVERLAY"
。否则,inner observable 将完成,因此除非 "OPEN_OVERLAY"
restarts 它无法发出它。
我已经开始将一些异步逻辑移植到 redux-observables,但我对此有些吃力。
我的用例是这样的:
我有一个 UI 叠加层,它应该在 OPEN_OVERLAY
操作时打开,并在三秒后自动关闭(通过发出 CLOSE_OVERLAY
),除非 INTERRUPT_CLOSE_OVERLAY1
或 INTERRUPT_CLOSE_OVERLAY2
收到操作,在这种情况下,覆盖不应关闭。
我的第一个镜头是这样的:
export const epic = action$ => action$.pipe(
filter(action => action.type === "OPEN_OVERLAY"),
delay(3000),
takeUntil(action$.ofType("INTERRUPT_CLOSE_OVERLAY1", "INTERRUPT_CLOSE_OVERLAY2")),
mapTo({type: "CLOSE_OVERLAY})
);
哪个有效,但只有一次。也就是说,如果你打开覆盖并中断它,那么在关闭并再次打开它之后它永远不会 auto-close.
我知道发生这种情况是因为 takeUntil
实际上取消了对 Observable 的订阅。但是我用 redux-observables 理解它的方式你只在设置时定义一次史诗而且你不应该是 subscribing/unsubscribing.
那么,我将如何构建 open/close/autoclose 无需取消订阅就始终有效的结构?
这是我的方法:
actions$.pipe(
filter(action => action.type === "OPEN_OVERLAY"),
switchMap(
() => timer(3000)
.pipe(
mapTo({ type: "CLOSE_OVERLAY" }),
takeUntil(action$.ofType("INTERRUPT_CLOSE_OVERLAY1", "INTERRUPT_CLOSE_OVERLAY2")),
)
)
)
它在"OPEN_OVERLAY"
发射时启动定时器,然后如果提供给takeUntil
的observable在此期间没有发射,它将成功发射"CLOSE_OVERLAY"
。否则,inner observable 将完成,因此除非 "OPEN_OVERLAY"
restarts 它无法发出它。