Я только что наткнулся на маленькую кроличью нору и не знал, как решить эту проблему «красиво».
Что я хочу:
- Я хочу отправить и ДЕЙСТВОВАТЬ,
- Я хочу изменить состояние редуктора фильтра в соответствии с ним.
- Я хочу получить отправленное действие от SAGA.
- Я хочу выбрать UP-TO-ДАТА состояние из саги.(вот кроличья нора)
Итак, как я могу сказать, что сага должна ждать, пока не изменится редуктор, чтобы я мог выбрать актуальное состояние.(конечно, я МОГУ обрабатывать изменения как в редукторе, так и в саге, но есть ли другой способ, где я обрабатываю изменение только один раз?)
// filters/actions.js
const changeFilterOption = (option, value) => ({
type: CHANGE_FILTER_OPTION,
payload: {
option,
value
}
})
// filters/reducer.js
reducer(state=initState, action) {
switch(action.type) {
//...
case CHANGE_FILTER_OPTION:
return changedFilterOptions...
//...
}
}
// listing/saga.js
saga(takeLatest(CHANGE_FILTER_OPTION, doSomeAPICallWithTheNewData))
function* doSomeAPICallWithTheNewData() {
//at this point the reducer might not changed yet,
//of course I can grab the payload and handle the changes in the saga as well.
//selectedOptions might not be updated...
const options = yield select(selectFilterOptions)
yield call(api.doSomeAPICall, option)
}