我有一种情况,将promise对象作为状态的一部分非常方便。简而言之 - 有一个状态包含用户在问答模式下提供的所有信息,经过一些回答后发送一个电话会很好,经过几个问题后还需要结果:
Q1 -> Q2 -> Q3 - -> Q4 - - -> Q5 -> Q6 -> Q7
\ - - Call to API - - /
在Q7之前,我需要在Q3之后检查通话结果。承诺作为国家的一部分,然后只是订阅结果,这将是非常容易的。 但我内心的感觉不应该发生。这样做可以吗?
我认为我的代码不会有助于理解,所以如果不清楚,请随意提问。
答案 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及其简单性,请将您的场景简化为单一事实:
根据您发送的请求:
if (currentQuestion > 3 && currentQuestion < 7 && !isDataRequested) {
dispatch(callToApi()); // this sets isDataRequested to true.
}
这将与一起使用并保持状态。