定义的操作signInUser
:
export const signInUser = createAsyncThunk(
"auth/loginUser",
async (user, thunkAPI) => {
const { username, password } = user;
try {
const res = await axios.post("/api/auth/login", { username, password });
thunkAPI.dispatch(loginUser(res.data));
} catch (err) {
console.log(err.message);
thunkAPI.dispatch(setErrors(err.response.data));
}
}
);
在表单提交时,handleSubmit()
分派signInUser()
操作。
组件:
const Login = () => {
const dispatch = useDispatch();
const navigate = useNavigate();
const handleSubmit = async (e) => {
e.preventDefault();
const { username, password } = formData;
try {
await dispatch(signInUser({ username, password }));
// DON'T WANT BELOW CODE TO RUN IF signInUser() FAILS (BUT IT DOES)
navigate("/posts");
} catch (err) {
console.log(err.message);
// NEED THIS CATCH TO RUN IF IT FAILS
}
};
导航是不可能的内部signInUser()
行动-据我所知。
所以我尝试从Login
组件的handleSubmit()
中导航。但是如果signInUser()
操作触发了它的catch
(由于登录失败),那么我不想在handleSubmit()
中触发navigate("/posts")
。我认为我需要它触发handleSubmit()
中的catch,而不是执行navigate("/posts")
。
或者用其他方式处理?
1条答案
按热度按时间tuwxkamq1#
createAsyncThunk
Thunk***always***返回一个解析的Promise,其中包含fulfilled
或rejected
action对象。有关详细信息,请参阅处理Thunk结果。但基本要点是,返回的thunk具有unwrap
属性,该属性提取已实现的payload
,或者如果由rejectWithValue
返回,则抛出错误对象或有效载荷。请参见展开结果操作。打开返回的Promise。
如果UI需要来自Thunk的值或错误,则这些也应该被返回。