Я отправляю действие и хочу обработать побочные эффекты.
Полезная нагрузка действия - id
.Внутри Effect
я хочу select
объект с переданным id
из магазина и объединить с action
.
У меня проблемы с логикой Effect
.
Action
export class ActionX implements Action {
readonly type = ActionTypes.ActionX;
constructor(public payload: { id: string }) {
}
}
Selector
export const selectById = createSelector(
selectState,
(state: XState, props) => {
let index = state.entities.findIndex(obj => obj.id === props.id);
if (index >= 0) {
return state.entities[index];
}
return undefined;
}
);
Пока у меня есть Effect
@Effect({ dispatch: false })
actionX$ = this.actions$
.pipe(
ofType<ActionX>(ActionTypes.ActionX),
withLatestFrom((action: ActionX) => this.store.pipe(select(selectById, { id: action.payload.id }))),
...
);
...
- это то, где я нене знаю, что делать.
Обычно я бы делал mergeMap(([action, obj]) => // do something ))
, но WebStorm указывает, что [action, obj]
имеет тип Observable<MyObj>
, а не тип массива.
PS: у меня есть dispatch: false
просто чтобы не выдавать ошибку, когда я выясняю, как обрабатывать операторы, я отправляю и действую с некоторой информацией из предыдущих операций.
EDIT
Теперь язнаю, что withLatestFrom
не может быть функцией стрелки с параметром.
Я смог найти это в stackoverflow:
map((action: LocalSubServiceTemplateActions.LoadLocalSubService) => action.payload.globalSubServiceId),
(globalSubServiceId) => {
return withLatestFrom(this.store.pipe(select(fromLocalSubservices.getSearchParams(globalSubServiceId))));
},
Но не смог обойти, поэтому следующий оператор внутритруба получает массив с [action, obj]
.