반응 redux에서 리디렉션하기 전에 작업이 완료되기를 기다리는 방법은 무엇입니까?

압달라 알 샤르마 니

redux 저장소의 isLoggedin 상태를 기반으로 사용자를 로그인하려고합니다. 내 로그인 구성 요소는 props에 매핑 된 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)


여기서 문제는 사용자가 로그인을 클릭 할 때 백엔드에서 사용자 로그인을 처리하는 redux 작업에 시간이 걸리고 userLogin 기능이 사용자가 로그인했는지 확인할 수있을만큼 빠르게 스토어가 업데이트되지 않는다는 것입니다. 나는 이것이 약속과 관련이 있음을 이해하지만 정확히 어떻게 해야할지 모르겠습니다.

아래에서 내 작업을 찾을 수 있습니다. 중요한 작업은 로그인 구성 요소에서 전달되는 fetchLogin뿐입니다.

export const userLoginRequest = () => {
    return {
        type: USER_LOGIN_REQUEST,
        payload: {
            isFetching: true
        }
    };
}

export const userLoginSuccess = (user) => {
    return {
        type: USER_LOGIN_SUCCESS,
        payload: {
            user: {
                ...user
            },
            isLoggedin: true,
            isFetching: false
        }
    };
}

export const userLoginFailed = () => {
    return {
        type: USER_LOGIN_FAILED,
        payload: {
            isFetching: false,
            isError: true
        }
    };
}

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

작업에서 프라 미스를 반환하고 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))
});

한 가지 더, 저는이 경우에 isLoggedinprops 를 추적 할 수 있기 때문에 dispatch from promise를 사용하여 제대로 리디렉션 할 필요가 없다는 것을 깨달았습니다 .useEffect

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

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

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

반환하기 전에 mongoose .exec () 함수가 완료되기를 기다리는 방법은 무엇입니까?

분류에서Dev

값을 반환하기 전에 다른 이벤트가 완료되기를 기다리는 방법은 무엇입니까?

분류에서Dev

임베디드 IE 브라우저 : 탐색이 완료되기 전에 리디렉션을 감지하는 방법은 무엇입니까?

분류에서Dev

제거하기 전에 반복되는 CAAnimation이주기를 완료 할 때까지 기다리는 방법

분류에서Dev

Angular 앱이 초기화되기 전에 http 리디렉션을 수행하는 방법은 무엇입니까?

분류에서Dev

Javascript로 이동하기 전에 전체 재귀가 완료되기를 기다리는 방법은 무엇입니까?

분류에서Dev

for 루프에서 비동기 쿼리가 완료되기를 기다리는 방법은 무엇입니까?

분류에서Dev

다른 창에서 트리거 된 관리 Bean의 메소드에서 기본 창을 업데이트 (리디렉션)하는 방법은 무엇입니까?

분류에서Dev

Meteor.user ()를 기다리고 컨테이너 내에서 정의되지 않은 경우 리디렉션하는 방법은 무엇입니까?

분류에서Dev

ThreadPoolExecutor 내의 모든 작업이 시간 초과 내에 완료되고 Executor를 종료하지 않고 완료되기를 기다리는 방법은 무엇입니까?

분류에서Dev

컴포넌트를 후크에 반응, redux-thunk에 의해 트리거 된 redux 작업을 마이그레이션하는 방법은 무엇입니까?

분류에서Dev

다음 기능으로 시작하기 전에 기능 완료를 기다리는 방법은 무엇입니까?

분류에서Dev

SwiftUI에서 한보기에서 다른보기로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

Xamarin Android를 사용하여 작업이 완료되기 전에 진행률 표시 줄을 표시하는 방법은 무엇입니까?

분류에서Dev

GPU가 DirectX9에서 작업을 완료 할 때까지 기다리는 방법은 무엇입니까?

분류에서Dev

한 앱의보기에서 다른 앱의보기로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

로그인에서 이미 리디렉션 된보기로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

작업이 완료되기 전에 스레드가 종료되는 것을 방지하는 방법은 무엇입니까?

분류에서Dev

한 블루 프린트보기에서 다른 블루 프린트보기로 페이지를 리디렉션하는 방법은 무엇입니까?

분류에서Dev

Polymer, 다른 요소를 렌더링하기 전에 core-ajax가 완료되기를 기다리는 방법은 무엇입니까?

분류에서Dev

약속의 모든 코드가 해결되기 전에 완료되기를 기다리는 방법은 무엇입니까? (하지만 조금 더 복잡함)

분류에서Dev

수명이 짧은 애플리케이션이 종료되기 전에 Logback을 완전히 압축하는 방법은 무엇입니까?

분류에서Dev

파이썬의 멀티 스레딩에서 부모 작업이 완료 될 때까지 작업을 기다리는 방법은 무엇입니까?

분류에서Dev

k8s에서 롤링 업데이트를 완료하기 위해 X 초를 기다리는 방법은 무엇입니까?

분류에서Dev

Django 반환 리디렉션에서 메시지를 전달하는 방법은 무엇입니까?

분류에서Dev

빌드 메서드가 호출되기 전에 데이터를로드하기 위해 비동기 메서드 완료를 기다리는 방법은 무엇입니까?

분류에서Dev

이전 작업 상태를 기반으로 작업을 트리거하는 방법은 무엇입니까?

분류에서Dev

Django 기반 사이트에서 작업 중지 또는 다시 시작을 관리하는 방법은 무엇입니까?

분류에서Dev

루프의 각 반복에서 비동기 작업이 완료 될 때까지 기다리는 방법

Related 관련 기사

  1. 1

    반환하기 전에 mongoose .exec () 함수가 완료되기를 기다리는 방법은 무엇입니까?

  2. 2

    값을 반환하기 전에 다른 이벤트가 완료되기를 기다리는 방법은 무엇입니까?

  3. 3

    임베디드 IE 브라우저 : 탐색이 완료되기 전에 리디렉션을 감지하는 방법은 무엇입니까?

  4. 4

    제거하기 전에 반복되는 CAAnimation이주기를 완료 할 때까지 기다리는 방법

  5. 5

    Angular 앱이 초기화되기 전에 http 리디렉션을 수행하는 방법은 무엇입니까?

  6. 6

    Javascript로 이동하기 전에 전체 재귀가 완료되기를 기다리는 방법은 무엇입니까?

  7. 7

    for 루프에서 비동기 쿼리가 완료되기를 기다리는 방법은 무엇입니까?

  8. 8

    다른 창에서 트리거 된 관리 Bean의 메소드에서 기본 창을 업데이트 (리디렉션)하는 방법은 무엇입니까?

  9. 9

    Meteor.user ()를 기다리고 컨테이너 내에서 정의되지 않은 경우 리디렉션하는 방법은 무엇입니까?

  10. 10

    ThreadPoolExecutor 내의 모든 작업이 시간 초과 내에 완료되고 Executor를 종료하지 않고 완료되기를 기다리는 방법은 무엇입니까?

  11. 11

    컴포넌트를 후크에 반응, redux-thunk에 의해 트리거 된 redux 작업을 마이그레이션하는 방법은 무엇입니까?

  12. 12

    다음 기능으로 시작하기 전에 기능 완료를 기다리는 방법은 무엇입니까?

  13. 13

    SwiftUI에서 한보기에서 다른보기로 리디렉션하는 방법은 무엇입니까?

  14. 14

    Xamarin Android를 사용하여 작업이 완료되기 전에 진행률 표시 줄을 표시하는 방법은 무엇입니까?

  15. 15

    GPU가 DirectX9에서 작업을 완료 할 때까지 기다리는 방법은 무엇입니까?

  16. 16

    한 앱의보기에서 다른 앱의보기로 리디렉션하는 방법은 무엇입니까?

  17. 17

    로그인에서 이미 리디렉션 된보기로 리디렉션하는 방법은 무엇입니까?

  18. 18

    작업이 완료되기 전에 스레드가 종료되는 것을 방지하는 방법은 무엇입니까?

  19. 19

    한 블루 프린트보기에서 다른 블루 프린트보기로 페이지를 리디렉션하는 방법은 무엇입니까?

  20. 20

    Polymer, 다른 요소를 렌더링하기 전에 core-ajax가 완료되기를 기다리는 방법은 무엇입니까?

  21. 21

    약속의 모든 코드가 해결되기 전에 완료되기를 기다리는 방법은 무엇입니까? (하지만 조금 더 복잡함)

  22. 22

    수명이 짧은 애플리케이션이 종료되기 전에 Logback을 완전히 압축하는 방법은 무엇입니까?

  23. 23

    파이썬의 멀티 스레딩에서 부모 작업이 완료 될 때까지 작업을 기다리는 방법은 무엇입니까?

  24. 24

    k8s에서 롤링 업데이트를 완료하기 위해 X 초를 기다리는 방법은 무엇입니까?

  25. 25

    Django 반환 리디렉션에서 메시지를 전달하는 방법은 무엇입니까?

  26. 26

    빌드 메서드가 호출되기 전에 데이터를로드하기 위해 비동기 메서드 완료를 기다리는 방법은 무엇입니까?

  27. 27

    이전 작업 상태를 기반으로 작업을 트리거하는 방법은 무엇입니까?

  28. 28

    Django 기반 사이트에서 작업 중지 또는 다시 시작을 관리하는 방법은 무엇입니까?

  29. 29

    루프의 각 반복에서 비동기 작업이 완료 될 때까지 기다리는 방법

뜨겁다태그

보관