Redux Observable: как использовать действие.полезная нагрузка в последней части цепи?
я столкнулся с этой проблемой несколько раз, когда я хочу получить доступ к action.payload
дальше по цепочке. Но к тому времени спор перешел на mergeMap
уже поменяли на что-то другое.
учитывая мое действие выглядит так:
{
type: BUY_GEMS,
payload: { value: 123, productIdentifier: "ABC123" }
}
и эта эпопея:
function purchaseGems(action$, store) {
return action$
.ofType(BUY_GEMS)
.mergeMap(action => {
const { productIdentifier } = action.payload; // <-------- works because it's the first mergeMap in this sequence
return Observable.fromPromise(
// Some promise call
).catch(error => Observable.of(buyGemsRejected(error)));
})
.mergeMap(action => {
const { value } = action.payload; // <----------- doesn't work because "action" is now just the response of the Promise above.
...
});
}
как бы я это сделал?
1 ответов
этот трюк, чтобы просто разместить свой второй mergeMap
внутри закрытия, где доступно действие. На самом деле, даже если вам не нужен доступ к нему, я обычно рекомендую этот шаблон в redux-observable, в котором вы изолируете свои наблюдаемые цепочки внутри своего единственного оператора стратегии слияния верхнего уровня (mergeMap
, switchMap
и т. д.), Потому что это упрощает будущий рефакторинг, а также облегчает изоляцию ошибок (если добавлено).
function purchaseGems(action$, store) {
return action$
.ofType(BUY_GEMS)
.mergeMap(action => {
const { productIdentifier } = action.payload;
return Observable.fromPromise(somePromise)
.catch(error => Observable.of(buyGemsRejected(error)))
.mergeMap(response => {
const { value } = action.payload;
// ...
});
});
}
ваш пример имел Observable.fromPromise()
Я полагаю, это просто псевдо-код, поэтому я последовал его примеру с Observable.fromPromise(somePromise)
для большей ясности для других читателей.