Мне интересно, есть ли способ прослушать действие, которое было успешно отправлено в redux?
В библиотеке управления состоянием ngxs для Angular я могу делать следующее:
ngOnInit() {
this.actions$
.pipe(
ofActionSuccessful(AddedThingToDo),
map((event: AddedThingToDo) => event.thingToDo),
tap(thingToDo => console.info('Action was successfully dispatched'))
)
.subscribe();
}
Где я могу затем выполнить действие, когда я знаю, что AddedThingToDo был успешно отправлен. Это может быть что-то вроде закрытия модального окна или, возможно, отправка другого действия.
Я использую ng-redux для Angular 1.x, однако я думаю, что принцип должен оставаться таким же, как и для response redux.
Единственный способ, которым я это обошел, - это обратный вызов в моих действиях, но это очень неправильно:
export const addThingToDo = (model: IThingToDo, onSuccess?: (model: IThingToDo) => void) =>
async (dispatch: Dispatch) => {
dispatch(addingThingToDo());
try {
const createdItem = await api.post<IThingToDo>(url, model);
dispatch(addedThingToDo(createdItem));
if (onSuccess) {
onSuccess(createdItem);
}
}
catch (ex) {
dispatch(addThingToDoFailure(ex));
}
};



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Оказывается, redux-thunk поддерживает возврат обещаний, поэтому я могу просто вернуть обещание, а не использовать метод обратного вызова.
export const addThingToDo = (model: IThingToDo) =>
async (dispatch: Dispatch): Promise<IThingToDo> =>
await new Promise<IThingToDo>(async (resolve, reject) => {
dispatch(addingThingToDo());
try {
const newItem = await api.post<IThingToDo>(url, model);
dispatch(addedThingToDo(newItem));
resolve(newItem);
} catch (ex) {
dispatch(addThingToDoFailure(ex));
reject(ex);
}
});
this.addThingToDo(thingToDo)
.then(t => navigateTo(`/things-to-do/${t.id}`));