Я использую реакцию, наблюдаемую для оркестровки вызовов AJAX в своем приложении. Я подключился к блоку «реакция-редукция-загрузка», чтобы показать загрузочную панель при запуске AJAX и скрыть ее при завершении. Он работает, но он не чувствует себя «чистым».Лучший практический подход для испускания действия в начале и конце потока наблюдаемых в эпопее?
Есть ли лучший способ использовать RXJS или редукцию, чтобы сделать это чище?
import Rx from "rxjs";
import {combineEpics} from "redux-observable";
import client from "../../integration/rest/client";
import {showLoading, hideLoading} from 'react-redux-loading-bar'
import * as types from "./actionTypes";
import * as actions from "./actions";
const fetchEpic = action$ =>
action$.ofType(types.FETCH)
.mergeMap(action =>
Rx.Observable.of(showLoading()).merge(
client({method: 'GET', path: '/api'})
.mergeMap(payload => Rx.Observable.of(actions.fetchSuccess(payload), hideLoading()))
.catch(error => Rx.Observable.of(actions.fetchFailure(error), hideLoading()))
)
);
export default combineEpics(fetchEpic);
UPDATE:
Посмотрев на предложение Мартина с помощью CONCAT Я приложил упрощенную версию, которую я доволен.
import Rx from "rxjs";
import {combineEpics} from "redux-observable";
import client from "../../integration/rest/client";
import {showLoading, hideLoading} from 'react-redux-loading-bar'
import * as types from "./actionTypes";
import * as actions from "./actions";
const fetchEpic = action$ =>
action$.ofType(types.FETCH)
.mergeMap(action =>
Rx.Observable.merge(
Rx.Observable.of(showLoading()),
client({method: 'GET', path: '/api'})
.map(payload => actions.fetchSuccess(payload))
.catch(error => Rx.Observable.of(actions.fetchFailure(error)))
.concat(Rx.Observable.of(hideLoading()))
)
);
export default combineEpics(fetchEpic);
Ваш пример не совсем подходит для наблюдаемых сокращений, но ваше предложение взглянуть на concat было именно тем, что мне нужно было немного упростить. Я отправлю обновленную версию и пометьте это как ответ; предполагая, что никто другой не превзойдет ваше предложение к концу дня. –