0

我有一种情况,将 Promise 对象作为状态的一部分非常方便。简而言之 - 有一个状态包含用户在问答模式中提供的所有信息,并且在一些答案之后发送呼叫会很好,在几个问题之后将需要其结果:

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

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

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

4

2 回答 2

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);

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

于 2018-04-12T14:11:00.000 回答
1

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

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

基于此,您发送请求:

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

这将持久化和水合状态一起工作。

于 2018-04-12T16:12:22.700 回答