Javascript 如何在react redux中重定向之前等待操作完成?

Javascript 如何在react redux中重定向之前等待操作完成?,javascript,reactjs,redux,promise,async-await,Javascript,Reactjs,Redux,Promise,Async Await,我正在尝试根据redux商店的isLoggedin状态登录用户。我的登录组件从映射到道具的userLogin操作中分派fetchLogin操作 const Login = (props) => { const [userLogin, setUserLogin] = useState({ email: "", password: "" }) const getValue = e => { e.preventDefault(); setU

我正在尝试根据redux商店的isLoggedin状态登录用户。我的登录组件从映射到道具的userLogin操作中分派fetchLogin操作

const Login = (props) => {
    const [userLogin, setUserLogin] = useState({ email: "", password: "" })

    const getValue = e => {
        e.preventDefault();
        setUserLogin({
            ...userLogin,
            [e.target.name]: e.target.value 
        });
    }

    const makeRequest = (e) => {
        e.preventDefault()
        props.userLogin(userLogin)

        if (props.isLoggedin === true) {
            console.log(Cookie.get('accessToken'))
            props.history.push('/dashboard')
        }
    }

    return (
        <Fragment>
            <Form onSubmit={makeRequest}>
                <Form.Group controlId="formBasicEmail">
                    <Form.Label>Email Address</Form.Label>
                    <Form.Control
                        type="email"
                        name="email"
                        placeholder="Enter email"
                        onChange={getValue}
                    >
                    </Form.Control>
                </Form.Group>
                <Form.Group controlId="formBasicPassword">
                    <Form.Label>Password</Form.Label>
                    <Form.Control
                        type="password"
                        name="password"
                        placeholder="Enter password"
                        onChange={getValue}
                    >
                    </Form.Control>

                </Form.Group>
                <Button
                    variant="primary"
                    type="submit"
                >
                    Login
            </Button>
            </Form>
        </Fragment>
    )
}

const mapStateToProps = (state) => ({
    isFetching: state.userReducer.isFetching,
    isLoggedin: state.userReducer.isLoggedin,
    isError: state.userReducer.isError,
    errMessage: state.userReducer.errMessage
});

const mapDispatchToProps = dispatch => ({
    userLogin: (userLogin) => {
        dispatch(fetchLogin(userLogin))
    }
});

export default connect(
    mapStateToProps,
    mapDispatchToProps
)(Login)



您可以从操作中返回承诺,并在解决后设置
isLoggedin
状态:

export const fetchLogin = (userLogin) => dispatch => {
  dispatch(userLoginRequest())
  return axios.post('/login', {
      email: userLogin.email,
      password: userLogin.password
    })
    .then(response => {
      if (response.status === 200) {
        dispatch(userLoginSuccess(response.data))
      }
      return response; 
    }).catch(err => {
      console.log("Error", err)
      dispatch(userLoginFailed())
    })
}

// ...

 const makeRequest = (e) => {
   e.preventDefault()
   props.userLogin(userLogin).then(resp => {
     if (props.isLoggedin === true) {
       console.log(Cookie.get('accessToken'))
       props.history.push('/dashboard')
     }
   })
 }
此外,为了实现此功能,您需要更新
mapDispatchToProps
,以实际返回调度:

const mapDispatchToProps = dispatch => ({
    userLogin: (userLogin) => dispatch(fetchLogin(userLogin))
});
还有一件事,我刚刚意识到,在这种情况下,使用dispatch的承诺正确重定向实际上是没有必要的,因为可以在
useEffect
中跟踪
isLoggedin
prop

 const makeRequest = (e) => {
  e.preventDefault()
  props.userLogin(userLogin)
}

useEffect(() => {
  if (props.isLoggedin === true) {
    console.log(Cookie.get('accessToken'))
    props.history.push('/dashboard')
  }
}, [props.isLoggedin])

我知道我需要返回一个承诺,但似乎我们实际上并没有返回承诺,我得到了一个错误。then不是一个函数。
return response
应该在条件之外,更新了答案。不,仍然不工作,我仍然得到相同的错误,但是在定义useLogin函数的mapDispatchToProps中,问题似乎是承诺没有直接返回到它。啊,对,你需要在那里使用隐式返回。更新了答案。你是马安人!是的,我早就认为这可能管用,但我傻了,没有尝试。非常感谢。
 const makeRequest = (e) => {
  e.preventDefault()
  props.userLogin(userLogin)
}

useEffect(() => {
  if (props.isLoggedin === true) {
    console.log(Cookie.get('accessToken'))
    props.history.push('/dashboard')
  }
}, [props.isLoggedin])