承诺作为国家的一部分在redux

时间:2018-04-12 13:25:27

标签: redux reswift

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

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

在Q7之前,我需要在Q3之后检查通话结果。承诺作为国家的一部分,然后只是订阅结果,这将是非常容易的。 但我内心的感觉不应该发生。这样做可以吗?

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

2 个答案:

答案 0 :(得分:1)

您可以使用redux-promise中间件,如果该操作已完成,正在进行或失败,您的操作将返回您的承诺。因此,您可以根据承诺轻松管理问题并在您需要的正确时间拨打电话。我在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);

这种方法可以为您提供细粒度的控制。

答案 1 :(得分:1)

你不应该这样做,因为不再可能序列化你的州。有多少问题,不确定,它可能只会破坏您正在使用或将要使用的devtools或某些持久性/水合库。但要坚持redux及其简单性,请将您的场景简化为单一事实:

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

根据您发送的请求:

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

这将一起使用并保持状态。