Как мне решить этот своего рода побочный эффект - PullRequest
0 голосов
/ 25 сентября 2018

Я только что наткнулся на маленькую кроличью нору и не знал, как решить эту проблему «красиво».

Что я хочу:

  • Я хочу отправить и ДЕЙСТВОВАТЬ,
  • Я хочу изменить состояние редуктора фильтра в соответствии с ним.
  • Я хочу получить отправленное действие от 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)
    }

1 Ответ

0 голосов
/ 27 сентября 2018

Sagas получит действие после того, как редуктор обновит магазин.Таким образом, вы можете с уверенностью предположить, что данные, которые вы выбираете из хранилища, являются актуальными.

Однако данные «возможно» устаревают в редких случаях, когда какое-либо промежуточное ПО в потоке до sagaMiddleware не работает синхроннозвоните next(action).

Ссылки

Прочитайте цитату в официальных документах:
https://redux -saga.js.org / docs /api / index.html # selectselector-args

Комментарий GitHub от автора:
https://github.com/redux-saga/redux-saga/issues/148#issuecomment-187898044

Исходный код:
https://github.com/redux-saga/redux-saga/blob/master/packages/core/src/internal/middleware.js#L44

...