return EMPTY 使我的 redux 可观察链崩溃

return EMPTY crash my redux observable chain

我正在使用 redux,redux-observable。

我有以下

import { EMPTY, Observable } from "rxjs";

const setCurrentDatastoreIdEpic = (action$, state$): Observable<any> => action$.pipe(
    ofType(DatastoreActions.setCurrentDatastoreId),
    map((action: {payload: {datastoreId: string}}) => {
        if(action.payload.datastoreId) {
            return ItemsActions.getItemsListRequest({
                datastoreId: action.payload.datastoreId,
                page: 1,
            });
        } else {
            return EMPTY;
        }
    })
);

但是每次我进去的时候我都有

Uncaught Error: Actions must be plain objects. Use custom middleware for async actions.

但是他们说如果没有调度的动作就使用 EMPTY。

我也试过 Observable.empty() 但它说 Observable 中不存在空值(而且我看到这种方式已被弃用)

问题是您正在使用运算符 map,而在其中您正在 returning EMPTYEMPTY 是一个 Observable,它不发出 next 通知,只发出一个 complete 通知。但是 map 不关心你 return 从它的投影函数中得到什么,所以它需要 EMPTY 并在 redux-observable 抱怨的地方进一步传递它,因为 EMPTY 不是一个动作.

因此,您可以使用 concatMap(或者 mergeMap 也可以)而不是 map,并将 ItemsActions.getItemsListRequest 换成 of()。将 EMPTY 返回到 concatMap 是完全正确的。

concatMap((action: {payload: {datastoreId: string}}) => {
    if(action.payload.datastoreId) {
        return of(ItemsActions.getItemsListRequest({
            datastoreId: action.payload.datastoreId,
            page: 1,
        }));
    } else {
        return EMPTY;
    }
})

除此之外,如果你只是想要一些动作史诗,你可以使用 ignoreElements() 而不是 map