在检查状态之前等待 thunk 完成 HTTP 请求

Posted

技术标签:

【中文标题】在检查状态之前等待 thunk 完成 HTTP 请求【英文标题】:Wait for thunk to finish the HTTP request before checking state 【发布时间】:2020-10-20 02:17:22 【问题描述】:

我是使用 thunk 的 React-Redux 的新学习阶段,所以我有这个 login 状态,它有 isLoggedIn 布尔值,我想检查我是否希望用户重定向到主屏幕。

所以,我正在向返回用户的Node.JS 服务器发出 thunk 请求,并将 isLoggedIn 标志设置为 true,但是当我对其进行验证时,我需要单击 @987654326 @按钮两次重定向。

我 99% 确定这是因为异步 thunk 行为,我的问题是如何解决它?

const Login = ( authenticate, IsUserLoggedIn ) => 
        const [email, setEmail] = useState('');
        const [password, setPassword] = useState('')
        const history = useHistory()
    
        const onSubmit = e => 
            e.preventDefault();
            const user = 
                email,
                password
            
            authenticate(user); //<---- Thunk Request
            if (IsUserLoggedIn)       //<---- Initially false, set to true on successful login
                history.push('/tracker')
            
        
        return (
            <>
                <h3>Login</h3>
                <form onSubmit=onSubmit>
                    <div className="form-control">
                        <label htmlFor="email">Email</label>
                        <input type="email" value=email onChange=(e) => setEmail(e.target.value) placeholder="Enter email..." />
                    </div>
                    <div className="form-control">
                        <label htmlFor="Password">Password </label>
                        <input type="password" value=password onChange=(e) => setPassword(e.target.value) placeholder="Enter password..." />
                    </div>
                    <button className="btn">Login</button>
                </form>
            </>
        )
    
    
    const mapStateToProps = state => (
        IsUserLoggedIn: getIsUserLoggedIn(state)
    )
    
    const mapDispatchToProps = dispatch => (
        authenticate: user => dispatch(getUser(user))
    )
    
    export default connect(mapStateToProps, mapDispatchToProps)(Login)

这是我的Thunk 请求

export const getUser = user => async dispatch => 
    try 
        const config = 
            headers: 
                'Content-Type': 'application/json'
            
        
        let body = JSON.stringify(user)
        const response = await axios.post('/api/v1/users/login',body, config)
        dispatch(setUserInfo(response))
    
    catch (error) 
       dispatch(userError(error.response.data.error))
    

这似乎是一个非常普遍的问题,但似乎无法找到解决方案。如果需要更多代码,请告诉我

【问题讨论】:

【参考方案1】:

您可以尝试以下方法:

const Login = ( authenticate, IsUserLoggedIn ) => 
  const history = useHistory();
  React.useEffect(() => 
    if (IsUserLoggedIn) 
      history.push('/tracker');
    
  , [IsUserLoggedIn, history]);

不确定 useHistory 是否每次都返回相同的对象,但我会这么认为。

【讨论】:

以上是关于在检查状态之前等待 thunk 完成 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

Redux thunk:如何等待异步操作的完成

Redux thunk:等待异步函数调度

thunk 和 action 完成后如何使用 redux 的当前状态?

javascript - redux thunk 不等待任何承诺

反应 redux,thunk 完成事件过早发生

Angular 2+等待方法/可观察完成