Redux: ждите завершения эпического действия - PullRequest
0 голосов
/ 10 сентября 2018

Я использую react + redux + redux-observable.

У меня есть следующие эпические действия:

export const fetchCompaniesEpic = (action$: Observable<Action>): Observable<Action> =>
    action$.pipe(
        ofType(FETCH_COMPANIES),
        take(1),
        switchMap((action: any) => WebServiceProxy.getCompanies().pipe(map((companies: Company[]) => fetchCompaniesFulfilled(companies))))
    );

, который выполняет некоторую асинхронную операцию, а затем вызывает «обычное действие» с результатами:

export const fetchCompaniesFulfilled = (companies: Company[]) => ({ type: 'FETCH_COMPANIES_FULFILLED', companies });

Затем внутри своего контейнера я отправляю эпическое действие следующим образом:

const mapDispatchToProps: any = (dispatch: Dispatch<Action>, ownProps: any) => ({
    fetchCompanies: (): void => {
        dispatch({ type: FETCH_COMPANIES });
    }
});

Все работает как заклинание, но как я могу узнать, когда эпическое действие закончится?

Я хотел бы сделать что-то вроде dispatch({ type: FETCH_COMPANIES }).subscribe(...)

1 Ответ

0 голосов
/ 10 сентября 2018

В данный момент я нашел следующее решение, и я публикую его, чтобы узнать ваши мысли об этом и помочь кому-то еще с той же проблемой.

Я реализовал Thunk, который делает то, что я ищу.

Это действие Thunk:

export const fetchCompaniesThunk = () => {
    return (dispatch: any) => {
        return fetchCompanies().pipe(map((companies: Company[]) => dispatch(fetchCompaniesFulfilled(companies))));
    };
};

Это действие fetchCompaniesFulfilled:

export const fetchCompanies = (): Observable<any> => {
    return WebServiceProxy.getCompanies().pipe(take(1));
};

А из контейнера я могу сделать:

dispatch(fetchCompaniesThunk()).subscribe((data: any) => {
    console.log('finished to fetch companies', data);
});

Даже если решение работает нормально, я не очень доволен. Или лучше мой актуальный вопрос: зачем мне redux-observable?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...