У меня есть следующий код:
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 отправленного действия)?
Что я делаю не так?
Спасибо.