redux-sagas 中的 put 操作是否与触发操作一起以原子方式处理?

问题描述 投票:0回答:1

假设我有一个包含两个切片的 redux 状态。每片都有一个数字。

一个数字由动作

SET_NUMBER
控制,另一个数字由
SET_OTHER_NUMBER
控制。

此外,我有一个传奇,试图确保另一个数字始终与第一个数字匹配。像这样的东西:

function* changeOtherNumber(action) {
    yield put(setOtherNumber(action.payload.number))
}

function* watchSetNumber() {
  yield takeEvery('SET_NUMBER', changeOtherNumber)
}

我的问题:如果我调度一个

SET_NUMBER
动作,我是否会冒着(即使是暂时)渲染一个数字彼此相等的组件的风险?或者,在任何重新渲染有机会运行之前,传奇是否会启动并更改另一个数字?换句话说,从 React 应用程序的角度来看,
SET_OTHER_NUMBER
是否与
SET_NUMBER
一起以原子方式调度和处理?


docs 的内容如下:

put(action)​

创建一个效果描述,指示中间件安排将操作分派到存储。此调度可能不会立即进行,因为其他任务可能位于 saga 任务队列中或仍在进行中。

但是,您可以期望存储在当前堆栈帧中更新(即通过

yield put(action)
之后的下一行代码),除非您有其他具有延迟操作传播的异步流的 Redux 中间件。

但我很难理解这些公式。


如果放置操作与原始

SET_COLOR
操作原子/同步运行建议的方法是什么来进行此类原子更新?或者我应该彻底重新考虑设计?

reactjs redux redux-saga
1个回答
0
投票

1。 redux-sagas 中的

put
操作与触发操作是原子的吗?

  • 不,redux-sagas 中的 put 操作与原始操作不是原子的。有一个短暂的时刻,状态可能会不一致。

2。为什么会这样?

  • put
    效果安排动作的调度,由于 saga 队列中的其他任务,该动作可能不会立即发生。

3.你该怎么办?

  • 已在下方回复

将状态更新合并到单个操作和减速器中以确保原子性:

const SET_NUMBERS = 'SET_NUMBERS';

const setNumbers = (number) => ({
  type: SET_NUMBERS,
  payload: { number }
});


const initialState = { number: 0, otherNumber: 0 };

function numbersReducer(state = initialState, action) {
  switch (action.type) {
    case SET_NUMBERS:
      return {
        ...state,
        number: action.payload.number,
        otherNumber: action.payload.number
      };
    default:
      return state;
  }
}


dispatch(setNumbers(newNumber));
© www.soinside.com 2019 - 2024. All rights reserved.