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 EMPTY
。 EMPTY
是一个 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
我正在使用 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 EMPTY
。 EMPTY
是一个 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