我来自ngrx背景,并且习惯于使用类型化动作的ngrx方式。
即
export class RestoreWindowState implements FluxStandardAction {
public readonly type = windowActionTypes.WINDOW_RESTORE_STATE;
constructor(public payload: IWindowState) {}
}
FluxStandardAction看起来像这样
export interface FluxStandardAction {
type: string;
payload?: any;
error?: boolean;
meta?: any;
}
我编写了一个自定义中间件来将new windowActions.RestoreWindowState(state)
转换为普通对象。这是我的中间件的样子。
export const actionToPlainObjectMiddleware = store => next => action => {
if (typeof action === 'object' && action.type) {
const toForward = { ...action };
return next(toForward);
} else {
throw new Error('Action must be FSA');
}
};
现在,如果我这样做
const loadWindowStateFromStorageEpic = action$ =>
action$.ofType(windowActionTypes.WINDOW_LOAD_STATE_FROM_STORAGE).pipe(
mapTo(() => {
const windowState = WindowStateKeeper.load('main');
return new windowActions.RestoreWindowState(windowState);
}),
);
我得到了
Error: Action must be FSA
我哪里错了?
答案 0 :(得分:1)
问题在于您使用的是mapTo
而不是map
。 mapTo
只接受一个参数,这是您要映射到的值。而map
采用一个被调用的投影函数,用于将当前值映射到其他值 - 这就是你想要的。
// v--------- here
mapTo(() => {
const windowState = WindowStateKeeper.load('main');
return new windowActions.RestoreWindowState(windowState);
})
// change to
map(() => {
const windowState = WindowStateKeeper.load('main');
return new windowActions.RestoreWindowState(windowState);
})
因此,在这种情况下,您将操作映射到函数,并且该函数是按原样调度的。