как правильно использовать switchMap в redux-observable - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующий код:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/switchMap';

import {
    PREVIEW_GROUP_STARTED,
    previewGroupSuccess,
    previewGroupFail
} from '../../actions/groups-actions-creators';
import ApiUtils from '../../util/ApiUtils';

export const previewGroupEpic = action$ =>
    action$
        .ofType(PREVIEW_GROUP_STARTED)
        .switchMap(action => {
            console.log({ action });
            const { whereCriteria, groupType } = action;
            const previewGroupObservable = getPreviewGroupObservable({
                whereCriteria,
                groupType
            });
            return previewGroupObservable
                .map(({ table, widget }) => {
                    if (!table) {
                        table = [];
                    }
                    if (!widget) {
                        widget = [];
                    }
                    return previewGroupSuccess({ tableData: table, graphData: widget });
                })
                .catch(error => {
                    console.log('preview group catch!');
                    return Observable.of(previewGroupFail({ error }));
                });
        });

const getPreviewGroupObservable = ({ whereCriteria, groupType }) => {
    console.log(whereCriteria);
    const body = {
        whereCriteria: whereCriteria,
        groupType
    };
    const api = `/webApi/smartFilterGrouping/groups/preview`;

    return Observable.fromPromise(ApiUtils.post(api, body))
        .catch(err => {
            console.log(err);
            throw 'Could not get create group Observable';
        })
        .map(response => {
            if (response && response.data && response.data.mainData) {
                return response.data.mainData;
            } else {
                console.log('preview group Observable map - bad response:', response);
                throw 'Could not preview group';
            }
        })
        .catch(err => {
            console.log(err);
            throw 'Could not preview group';
        });
};

switchMap «не работает» (я полагаю, я использую его не в том месте - не могу понять, куда он должен идти и чего мне не хватает) - Если я отправлю 2 действия PREVIEW_GROUP_STARTED хотя первый еще не закончен (PREVIEW_GROUP_SUCCESS еще не отправлен) - я получу 2 действия PREVIEW_GROUP_SUCCESS из моего эпоса.

это иногда приводит к действительно плохой ситуации, когда пользователю показывается результат более старого запроса на предварительный просмотр (условие гонки ошибочно:).

Я знаю, что switchMap - это оператор, который мне нужен, я просто не понимаю, как правильно его использовать.

что я должен сделать, чтобы отправить только одно PREVIEW_GROUP_SUCCESS (результат последнего PREVIEW_GROUP_START отправленного действия)?

Что я делаю не так?

Спасибо.

...