【发布时间】:2020-12-20 06:21:10
【问题描述】:
我有一个名为getRole 的操作和一个名为getPoliciesFrom 的操作。 getRole 返回角色,getPoliciesFrom 返回附加到该角色的策略列表。然后我需要调度这些动作来支持一个特性。
我在useEffect 中发送getRole 并使用useSelector 获取role 作为状态
const role = useSelector((state: RootState) => state.settings.role);
//...
useEffect(() => {
dispatch(getRole());
}, [dispatch]);
现在为了获得政策,我想到了两个选择:要么我添加一个条件检查以查看 role 是否为空,当它不是 null 时,发送 getPoliciesFrom 并传入 @987654333 @ 作为它的论点。所以看起来像这样:
const role = useSelector((state: RootState) => state.settings.role);
useEffect(() => {
dispatch(getRole());
if(role) {
dispatch(getPoliciesFrom(role));
}
}, [dispatch]);
或者我使用第一次调度返回的承诺,并在承诺解决时将第二次调度附加到then。看起来像这样
useEffect(() => {
dispatch(getRole()).then(result => dispatch(getPoliciesFrom(result))
}, [dispatch]);
两者似乎都在工作。但是对于第二种方法,我的 ts 编译器对我大喊大叫 then 我附在调度上,说
“AsyncThunkAction'。
但我确实从getRole 返回了结果。这是它的代码
export const getRole = createAsyncThunk(
"settings/getRole",
async () => {
let response: GetServiceRoleForAccountResponse;
try {
response = await api.getServiceRoleForAccount().promise();
} catch (error) {
if (
error.statusCode === notAssociatedStatusCode &&
error.message === notAssociatedErrorMessage
) {
return { role: null };
}
throw error;
}
return { role: response.role };
}
);
我也不确定如何正确键入从承诺中返回的result。
最重要的是,这里哪种方法更好?
【问题讨论】:
-
确保在 getRole 中返回结果:
const getRole = arg => dispatch => {return async.then((role)=>{dispatch(someAction);return role;})}
标签: reactjs typescript redux redux-toolkit