programing

redux-thunk 액션을 비동기/비동기화하는 방법

batch 2023. 4. 6. 21:21
반응형

redux-thunk 액션을 비동기/비동기화하는 방법

action.displaces

export function getLoginStatus() {
  return async(dispatch) => {
    let token = await getOAuthToken();
    let success = await verifyToken(token);
    if (success == true) {
      dispatch(loginStatus(success));
    } else {
      console.log("Success: False");
      console.log("Token mismatch");
    }
    return success;
  }
}

component.displaces(컴포넌트).

  componentDidMount() {
    this.props.dispatch(splashAction.getLoginStatus())
      .then((success) => {
        if (success == true) {
          Actions.counter()
        } else {
          console.log("Login not successfull");
        }
     });
   }

단, 다음과 같이 component.js 코드를 비동기/대기 모드로 쓰면 다음과 같은 오류가 발생합니다.

Possible Unhandled Promise Rejection (id: 0): undefined is not a function (evaluating 'this.props.dispatch(splashAction.getLoginStatus())')

component.displaces(컴포넌트).

  async componentDidMount() {
     let success = await this.props.dispatch(splashAction.getLoginStatus());
     if (success == true) {
       Actions.counter()
     } else {
       console.log("Login not successfull");
     }
   }

getLoginStatus()를 기다렸다가 나머지 문을 실행하려면 어떻게 해야 하나요?.then()을 사용하면 모든 것이 잘 작동합니다.비동기/대기 구현에 뭔가 부족한 것이 있는지 의심됩니다.그걸 알아내려고 애쓰고 있어요

Promise 어프로치

export default function createUser(params) {
  const request = axios.post('http://www...', params);

  return (dispatch) => {
    function onSuccess(success) {
      dispatch({ type: CREATE_USER, payload: success });
      return success;
    }
    function onError(error) {
      dispatch({ type: ERROR_GENERATED, error });
      return error;
    }
    request.then(success => onSuccess, error => onError);
  };
}

비동기/대기 접근법

export default function createUser(params) {  
  return async dispatch => {
    function onSuccess(success) {
      dispatch({ type: CREATE_USER, payload: success });
      return success;
    }
    function onError(error) {
      dispatch({ type: ERROR_GENERATED, error });
      return error;
    }
    try {
      const success = await axios.post('http://www...', params);
      return onSuccess(success);
    } catch (error) {
      return onError(error);
    }
  }
}

https://medium.com/@kkomaz/syslog-to-sysc-syslog-553c43f243e2를 사용한 Redux에 대해 설명하는 중간 투고에서 참조.

아스펜의 답변을 리믹스합니다.

import axios from 'axios'

import * as types from './types'

export function fetchUsers () {
  return async dispatch => {
    try {
      const users = await axios
        .get(`https://jsonplaceholder.typicode.com/users`)
        .then(res => res.data)

      dispatch({
        type: types.FETCH_USERS,
        payload: users,
      })
    } catch (err) {
      dispatch({
        type: types.UPDATE_ERRORS,
        payload: [
          {
            code: 735,
            message: err.message,
          },
        ],
      })
    }
  }
}

 

import * as types from '../actions/types'

const initialErrorsState = []

export default (state = initialErrorsState, { type, payload }) => {
  switch (type) {
    case types.UPDATE_ERRORS:
      return payload.map(error => {
        return {
          code: error.code,
          message: error.message,
        }
      })

    default:
      return state
  }
}

이렇게 하면 작업에 고유한 오류 배열을 지정할 수 있습니다.

비동기용 리믹스는 redux/thunk를 기다립니다.저는 단지 이것이 좀 더 유지보수가 용이하고 읽기 쉽다는 것을 알았습니다.Thunk(a function that wraps an expression to delay its evaluation~ redux-thunk )

actions.syslog

import axios from 'axios'
export const FETCHING_DATA = 'FETCHING_DATA'
export const SET_SOME_DATA = 'SET_SOME_DATA'

export const myAction = url => {
  return dispatch => {
    dispatch({
      type: FETCHING_DATA,
      fetching: true
    })
    getSomeAsyncData(dispatch, url)
  }
}

async function getSomeAsyncData(dispatch, url) {
  try {
    const data = await axios.get(url).then(res => res.data)
    dispatch({
      type: SET_SOME_DATA,
      data: data
    })
  } catch (err) {
    dispatch({
      type: SET_SOME_DATA,
      data: null
    })
  }
  dispatch({
    type: FETCHING_DATA,
    fetching: false
  })
}

리듀서.개요

import { FETCHING_DATA, SET_SOME_DATA } from './actions'

export const fetching = (state = null, action) => {
  switch (action.type) {
    case FETCHING_DATA:
      return action.fetching
    default:
      return state
  }
}

export const data = (state = null, action) => {
  switch (action.type) {
    case SET_SOME_DATA:
      return action.data
    default:
      return state
  }
}

처리되지 않은 약속 거부 가능성

당신이 놓친 것 같군요.catch(error => {});당신의 약속에 따라.이것을 시험해 보세요.

componentDidMount() {
    this.props.dispatch(splashAction.getLoginStatus())
        .then((success) => {
            if (success == true) {
                Actions.counter()
            } else {
                console.log("Login not successfull");
            }
        })
        .catch(err => {
            console.error(err.getMessage());
        }) ;
}

this.props.splashAction.getLoginStatus() 대신 dis.props.dispatch(splashAction.getLoginStatus())를 사용합니다.

언급URL : https://stackoverflow.com/questions/41930443/how-to-async-await-redux-thunk-actions

반응형