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
'programing' 카테고리의 다른 글
JavaScriptSerializer - 열거를 문자열로 JSON 직렬화 (0) | 2023.04.06 |
---|---|
JQuery Post sends form data and not JSON (0) | 2023.04.06 |
React Material UI - 여러 고차 (0) | 2023.04.06 |
각도 Js 통화, 기호 유로 이후 (0) | 2023.04.06 |
get_adjacent_post()를 커스텀 투고 유형 간에 동작시킵니다. (0) | 2023.04.01 |