使用动作创建者在其他动作创建者中调度动作

时间:2019-08-22 08:56:14

标签: redux redux-thunk

我想知道是否有一种模式可以让您在其他动作创建者内部使用动作创建者。 ModifyMassProperty动作创建器使您可以传递任意数量的动作,然后对其进行迭代并相应地进行分派。我非常希望能够在getOrbitalBurn动作创建器中使用此方法,因为从语义上讲,它比使用thunk连续三遍提供的dispatch方法更具吸引力。我相信我一定是错过了一些事情,或者因为我在少一生中炮制的某种反模式而感到内。

export const modifyMassProperty = (
  ...massProperties: MassProperty[]
): ThunkAction<void, AppState, void, Action> => (
  dispatch: Dispatch<ScenarioActionTypes>
) =>
  massProperties.forEach(massProperty =>
    dispatch({
      type: MODIFY_MASS_PROPERTY,
      payload: massProperty
    })
  );

export const getOrbitalBurn = (
  payload: { primary: string; periapsis: number; apoapsis: number },
  applyBurn = true
): ThunkAction<void, AppState, void, Action> => (
  dispatch: Dispatch<ScenarioActionTypes>,
  getState: any
) => {
  const scenario = getState().scenario;

  const primary = getObjFromArrByKeyValuePair(
    scenario.masses,
    'name',
    payload.primary
  );
  const orbit = orbitalInsertion(primary, payload, scenario.g);

  if (applyBurn) {
    const [spacecraft] = scenario.masses;

    dispatch({
      type: MODIFY_MASS_PROPERTY,
      payload: {
        name: spacecraft.name,
        key: 'vx',
        value: orbit.x
      }
    });
    dispatch({
      type: MODIFY_MASS_PROPERTY,
      payload: {
        name: spacecraft.name,
        key: 'vy',
        value: orbit.y
      }
    });
    dispatch({
      type: MODIFY_MASS_PROPERTY,
      payload: {
        name: spacecraft.name,
        key: 'vz',
        value: orbit.z
      }
    });
  }

  dispatch({
    type: MODIFY_SCENARIO_PROPERTY,
    payload: {
      key: 'orbitalInsertionV',
      value: { x: orbit.x, y: orbit.y, z: orbit.z }
    }
  });
};

0 个答案:

没有答案