如何在同一个史诗中调度多个动作

时间:2020-04-16 16:25:57

标签: reactjs typescript redux rxjs redux-observable

我正在使用React,Redux,Redux-Observable,rxjs和TypeScript。我有一部创造记录的史诗。我想从史诗中派遣其他动作。

export const createEpic: Epic = (action$) => action$.pipe(
    ofType(ITEMS_CREATE),
    mergeMap((action) => CoreCom.create<{Item: Item}>(
        '/items/index',
        {},
        'Item',
        action.item,
    ).pipe(
        map((response) => itemsCreateSuccess(response.response)),
        catchError(() => of(itemsCreateFailure())),
    )),
);
export const createSuccesEpic: Epic = (action$) => action$.pipe(
    ofType(ITEMS_CREATE_SUCCESS),
    map(
        () => enqueueSnackbar({
            message: 'Hello World!',
            options: {
                variant: 'success',
            },
        }),
    ),
);

第一个史诗对动作ITEMS_CREATE起反应。然后,它会触发呼叫并返回服务器响应。然后,调度动作ITEMS_CREATE_SUCCESS
另外,我想调度一个动作来显示通知。我最后写了两个史诗。

有人可以帮助我将这两个史诗“合并”为一个吗?还是这样好?

我无法从同一个史诗中调度两个动作。

编辑:

仅供参考:函数itemsCreateSuccess()itemsCreateSuccess()enqueueSnackbar()返回的内容与此类似:

export const itemsCreateSuccess = (response: Response): ItemsCreateSuccessAction => ({
    type: ITEMS_CREATE_SUCCESS,
    response,
});

它们只是返回动作

1 个答案:

答案 0 :(得分:0)

我认为您的解决方案有一个好处,那就是关注点分离,可以为您的代码带来更大的灵活性,因为稍后您可以使用此createSuccesEpic史诗来显示针对不同的“成功操作”的成功通知”(因为我不知道您的应用环境取决于您来考虑)。

关于您如何从createEpic分派这两个动作的问题,我看到了在第二个管道上使用mergeMapmerge的解决方案。因此您的代码将如下所示:

export const createEpic: Epic = (action$) => action$.pipe(
    ofType(ITEMS_CREATE),
    mergeMap((action) => CoreCom.create<{Item: Item}>(
        '/items/index',
        {},
        'Item',
        action.item,
    ).pipe(
        mergeMap(response => merge(
            of(itemsCreateSuccess(response.response)),
            of(enqueueSnackbar({ ... }))
        )),
        catchError(() => of(itemsCreateFailure())),
    )),
);
相关问题