• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

spinner가 바로 꺼지는 이유

20.01.26 21:44 작성 조회수 166

3

강의에서 axios 요청이 너무 빨라서 뜨지 않는다라고 설명해주셨는데, 이부분은이 잘못된거 같습니다. 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then 

// using a resolved promise, the 'then' block will be triggered instantly, 
// but its handlers will be triggered asynchronously as demonstrated by the console.logs
const resolvedProm = Promise.resolve(33);

let thenProm = resolvedProm.then(value => {
    console.log("this gets called after the end of the main stack. the value received and returned is: " + value);
    return value;
});
// instantly logging the value of thenProm
console.log(thenProm);

mdn의 설명을 보면, promise가 resolve 된 이후, then() 메서드 안의 핸들러는 비동기적으로 호출 된다고 설명하고 있습니다. 

(복사붙여 넣기를 하니 포맷이 이상해져서 읽기 불편한점 죄송합니다)

그래서 테스트를 해보았습니다. 

 //views/NewsView.vue
created() {
  bus.$emit("start:spinner");
// setTimeout(() => {
// }, 3000);
  this.$store.dispatch("FETCH_NEWS")
    .then(result => {
      bus.$emit("end:spinner");
      console.log("result");
      console.log(result);
      return result;
    })
    .catch(err => {
      console.error(err);
    });
}

//store/actions.js
export default {
  FETCH_NEWS(context) {
    fetchNewsList()
      .then(res => {
        context.commit('SET_NEWS', res.data);
        console.log('actions');
        console.log(res);
        return res;
      })
     .catch(err => {
        console.error(err);
      });
    },
}
//api/index.js
function fetchNewsList() {
  console.log('api call');
  return axios.get(`${config.baseUrl}news/1.json`);
}

이렇게 하니 콘솔창에
api call
result
undefined
actions
{ data: .... } //result 객체
아마도 핸들러를 바로 처리하지 않고, 함수의 끝에 다다르게 되어서
흐름이 newsview로 넘어간것 같습니다.
그래서 spinne가 도는 시간(api를 부르고 가져오는시간)이 없어서
그런거 같습니다. 오히려 actions가 확실하게 promise를 리턴하는
방식을 하기위해서 return fetchNewsList().then(...)
과 같은 방식을 취하니 조금의 시간 동안 스패너가 보입니다.

답변 4

·

답변을 작성해보세요.

2

안녕하세요 pius712님, 해당 내용에 대해 이후 강좌에서 설명하고 정정했습니다. 일단 제가 잘못 설명 드린 부분에 대해서 공식 문서까지 확인해가며 정확하게 파악하려고 하신 모습이 넘 보기 좋네요..! :) 말씀하신 것처럼 actions 함수에서 프로미스 리턴하면 됩니다. 아래 강좌를 참고해보세요 :)

https://www.inflearn.com/course/vue-js/lecture/17054

1

비오님의 프로필

비오

질문자

2020.01.29

이전의 게시물들 포함해서 이런 부분들 덕분에 더 깊게 배우게 된 것 같습니다! 감사합니다.

0

거니님의 프로필

거니

2021.02.10

와 덕분에 비동기에 대한 개념이 잡혀가고 있어요 ^^

0

박굿뜨님의 프로필

박굿뜨

2020.04.04

덕분에 promise를 왜쓰는지 한층더 이해하게 되었습니다! 감사합니다!