redux-observable 和 RxJS 有哪些选择

What alternatives are there to takeUntil with redux-observable and RxJS

我已经开始将一些异步逻辑移植到 redux-observables,但我对此有些吃力。

我的用例是这样的: 我有一个 UI 叠加层,它应该在 OPEN_OVERLAY 操作时打开,并在三秒后自动关闭(通过发出 CLOSE_OVERLAY),除非 INTERRUPT_CLOSE_OVERLAY1INTERRUPT_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 它无法发出它。