【问题标题】:RxJS 5 - function called twiceRxJS 5 - 函数调用两次
【发布时间】:2017-05-07 05:23:45
【问题描述】:

我试图在使用 RxJS 删除一行之前显示一个确认模式。

  • 如果我删除 1 行,下面的代码可以正常工作。
  • 当我删除第二行时,deleteLineFulfilled 会被调用 2 次。
  • 如果我删除第三行,那么 deleteLineFulfilled 会被调用 3 次,以此类推...

知道为什么吗?

const deleteLineEpic = (action$, store) =>
action$.ofType(DELETE_LINE_REQUEST)
    .flatMap((action) => Observable.merge(
                Observable.of(showModalYesNo('CONFIRM_DELETE')),
                action$.ofType(MODAL_YES_CLICKED).map(() =>
                    deleteLineFulfilled(action.line)
                )
                .takeUntil(action$.ofType(MODAL_NO_CLICKED))
           ));

【问题讨论】:

    标签: rxjs5 redux-observable


    【解决方案1】:

    action$ 是一个永久可观察对象,它只会在 MODAL_NO_CLICKED 类型的动作被调度时停止 - 从你的代码很难说什么时候发生,你应该在 @987654324 之前添加一个 .take(1) @。


    但是,对于这种架构,您必须确保必须发出 MODAL_YES_CLICKEDMODAL_NO_CLICKED 并且不能跳过该发射。

    更简单的方法是实现确认对话框,订阅结果,然后仅在结果为YES 时分派删除操作,如果结果为NO,则甚至不分派操作。这样一来,您将拥有更清晰的动作史诗。

    【讨论】:

    • 唯一的问题是在显示确认模态之前我需要运行一些验证(代码中没有包含它们),并且在调用 DELETE_LINE_REQUEST 时进行验证。但我明白你的意思。感谢您的帮助。
    • 在你的解释中,你说“从你的代码很难说什么时候会发生这种情况”,假设我想在MODAL_NO_CLICKMODAL_YES_CLICK 上做这件事。添加takeUntil(MODAL_YES_CLICK) 会在发送deleteLineFulfilled 之前停止观察。有可能这样做吗?
    【解决方案2】:

    试试这个:

            .first() // $action is a perpetual observable. Only take the first one.
            .takeUntil(action$.ofType(MODAL_NO_CLICKED))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      相关资源
      最近更新 更多