인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

doqndnffo님의 프로필 이미지
doqndnffo

작성한 질문수

Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex

actions 소개 및 예제

안녕하세요. 간단히 서버를 만들어서 axios로 비동기 통신하던중 질문드립니다.

작성

·

376

1

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'

Vue.use(Vuex);
const storage = {
    fetch() {
        const headers = {
            'Content-Type' : 'application/json',
            'Accept' : 'application/json'
        };
        return axios.get("http://localhost:8080/todo/list", {headers})
            .then(response => {
                console.log(response.data.result); //이부분 출력시는 잘나옴..
                return response.data.result //리턴하면 Promise가 todoItems에 Object로 들어감...
            });
        /*
        if (localStorage.length > 0) {
            for (let i =0; i < localStorage.length; i++) {
                if(localStorage.key(i) != 'loglevel:webpack-dev-server') {
                    let value = JSON.parse(localStorage.getItem(localStorage.key(i)));
                    arr.push(value);
                }
            }
        }
        */
    }
};
export const store = new Vuex.Store({
   state: {
       todoItems : storage.fetch()
   },
    mutations : {
        addOneItem(state, todoItem) {
            const obj = {
                seq : null,
                completed : false,
                item : todoItem
            };
            //localStorage.setItem(todoItem, JSON.stringify(obj));
            state.todoItems.push(obj);
        },
        removeOneItem(state, payload) {
            localStorage.removeItem(payload.todoItem.item);
            state.todoItems.splice(payload.index, 1);
        },
        toggleComplete(state, payload){
            state.todoItems[payload.index].completed = !state.todoItems[payload.index].completed;
            localStorage.removeItem(payload.todoItem.item);
            localStorage.setItem(payload.todoItem.item, JSON.stringify(payload.todoItem));
        },
        clearTodo(state) {
            state.todoItems = [];
            localStorage.clear();
        }
    },
    actions : {
        add(context, payload) {
            return axios.post("http://localhost:8080/todo/add", payload, {
                headers : {
                    'Content-Type' : 'application/json;charset=utf-8'
                }
            }).then(response => context.commit('addOneItem', response));
        }
    }
});

안녕하세요. 비동기통신을 하던중 서버에서 데이터를 잘 가져왔고 response를 console로 찍었을떄 Array가 나왔는데 이제 fetch 함수에서 todoItems를 초기화해줄떄 Promise라는 객체로 들어가게 됩니다. ㅠㅠ

예제처럼 arr로 들어가게 하고싶은데 혹시 어떻게 해야할까요..?ㅠㅠ 강의중 말씀하신 Promise 인지...

답변 2

1

doqndnffo님의 프로필 이미지
doqndnffo
질문자

대략적으로 변경한 소스는 fetch 함수부분이고  todoItems를 http 통신으로 가져와서 초기화 한후 add, delete 등등 적용해보려고 하였으나 Promise 객체가 등장한 이후 array로 초기화되지 않아서 어려움이 있습니다ㅠㅠ

0

안녕하세요 doqndnffo님, 좋은 질문이네요! 중급 강좌에서 바로 axios를 붙이실 생각을 하다니 잘하신 것 같습니다 :) 제가 바로 알아볼 수 있게 코드랑 설명 잘 첨부해주셔서 감사하구요. 위 코드를 보니 state 쪽 코드가 수정되어야 할 것 같습니다. 일단 fetch()의 결과는 Promise 객체가 되구요. 일반적으로는 컴포넌트 라이프 사이클이나 라우터 네비게이션 가드 쪽에서 axios get 요청을 한 다음에 받아오면 state에 담아줍니다.

위와 같은 구조는 제 수업 내용에 바로 비동기 처리를 적용하다보니 구조가 적합하지 않게 된 것인데요. 만약 그래도 무조건 여기서 데이터를 받아와야겠다 하신다면 store.fetch를 한번 더 Promise로 감싸거나 Promise.resolve() 같은 API를 활용해야 할 것 같습니다 :)

doqndnffo님의 프로필 이미지
doqndnffo

작성한 질문수

질문하기