2

在使用 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))
           ));
4

2 回答 2

3

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


但是,对于这种架构,您必须确保必须有一个MODAL_YES_CLICKED发射MODAL_NO_CLICKED,并且发射不能被跳过。

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

于 2016-12-21T17:42:12.873 回答
1

试试这个:

        .first() // $action is a perpetual observable. Only take the first one.
        .takeUntil(action$.ofType(MODAL_NO_CLICKED))
于 2017-04-13T19:43:14.077 回答