Promise 作为 redux 状态的一部分

Promise as a part of state in redux

我有一种情况,将 promise 对象作为状态的一部分真的很方便。简而言之 - 有一个状态包含用户在问答模式下提供的所有信息,在回答了一些问题后,最好打个电话,再问几个问题后将需要其结果:

Q1 -> Q2 -> Q3 - -> Q4 - - -> Q5 -> Q6 -> Q7 
                 \ - - Call to API - - /

在Q7之前我需要检查Q3之后的通话结果。将 promise 作为状态的一部分,然后订阅结果真的很容易。 但我内心觉得这不应该发生。这样可以吗?

我不认为我的代码有助于理解,所以如果不清楚,请随意提问。

您可以使用 redux-promise middleware, Your actions will return you promise if that action is completed, in-flight or failed. So you can easily manage questions and make call exactly at the right time you needed based on the promise. I have a sample example in my github 帐户,其中将说明如何使用它。如果您觉得它有用,请告诉我们。

下面是suedo代码

动作控制器

export const action_CALL = () => {
  return {
    type: SOME_CALL,
    payload: new Promise((resolve, reject) => {
                let wait = setTimeout(() => {
                resolve('DUMMY ... Few questions answered in x mins');
              }, 2000)
    }),
  };
};

减速器

export const countReducer = typeToReducer({
  [SOME_CALL]: {
    PENDING: (state, action) => ({
      ...state,
      answered: false,
    }),
    REJECTED: (state) => ({
      ...state,
      answered: false,
    }),
    FULFILLED: (state, action) => ({
      answered: true,
      callResponse: action.payload,
    })
  }
}, initState);

这种方法会给你细粒度的控制。

你不应该这样做,因为序列化你的状态将不再可能。不确定有多少问题,它可能只会破坏您正在使用或将要使用的开发工具或某些 persistence/hydration 库。但要忠于 redux 及其简单性,请将您的场景简化为一个事实:

  • 当前题是Q3过了但Q7之前吗?我想选择器可以确定这一点,因为当前问题肯定已经是状态的一部分了。
  • 是否已请求获取数据?

基于您发送的请求:

if (currentQuestion > 3 && currentQuestion < 7 && !isDataRequested) {
    dispatch(callToApi()); // this sets isDataRequested to true.
}

这将 保持和保湿状态。