【问题标题】:Promise as a part of state in reduxPromise 作为 redux 中状态的一部分
【发布时间】:2018-04-12 13:25:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可以将其实现到您的操作容器中,我认为没有任何问题
  • @AbdeslemCharif,你是说动作创建者吗?
  • 是的,在你的动作创建器中实现所有逻辑
  • 我有 Q3 之后我想发送请求,基本上,这是我有承诺的时刻。我不明白如何使用动作创建者从 Q7 访问这个承诺。
  • 所有这些 Q4、Q5、Q6 将是我流程中某处的一些不同功能。他们将接受用户输入并发送一些操作

标签: redux reswift


【解决方案1】:

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

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

基于您发送的请求:

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

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

【讨论】:

  • 所以基本上,你建议在没有承诺的情况下使用promiseState。因为isDataRequested 对我来说还不够。我还需要知道它是否失败以及是否完成
  • 只是为了让我的情况更清楚一点,我在不同的子减速器中有这个answer-results。它看起来像 store.dispatch(setCustomer(customer)) -> func customerReducer(state, action) {//return new state with customer} 和更多类似的东西。我希望它很清楚:)
  • @VladyslavZavalykhatko 然后您可以将 api 调用的结果添加到条件中。 !isDataRequested &amp;&amp; !success(但是成功是确定的)。如果你想重试失败,它会变得有点复杂,但与实际的承诺相同。
【解决方案2】:

您可以使用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);

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

【讨论】:

  • 这根本解决不了他的问题。
猜你喜欢
  • 1970-01-01
  • 2016-08-03
  • 2019-04-03
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2021-07-04
  • 1970-01-01
相关资源
最近更新 更多