我应该如何解决这种副作用(redux saga)

时间:2018-09-25 10:37:36

标签: redux redux-saga

我只是碰到一个小兔子洞,却不知道如何“好”地解决这个问题。

我想要什么:

  • 我要调度并采取行动,
  • 我想根据它更改过滤器的减速器状态。
  • 我想从SAGA那里获取派遣的ACTION。
  • 我想从传奇中选择一个最新的状态。 (这里是 兔子洞)

所以我该如何说传奇故事,直到减速器发生变化,因此我可以选择最新状态。 (当然,我可以处理reducer和saga中的更改,但是有另外一种方法,我只处理一次更改吗?)

    // 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 :(得分:1)

在减速器更新商店后,Sagas将收到操作。因此,可以放心地假设从存储中选择的数据是最新的。

但是,在极少数情况下,sagaMiddleware之前的流中的任何中间件都不会同步调用{{1}}时,数据可能“过时”。

参考

阅读官方文档中的blockquote:
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