Muscardinus

setState에서 async를 사용해도 될까? 본문

FrontEnd/React Basics

setState에서 async를 사용해도 될까?

Muscardinus 2020. 12. 26. 20:32
728x90

React의 state 상태를 변경하기 위해서는 setState를 사용해야한다. setState의 경우 비동기 적으로 행동한다.

 

비동기 함수의 경우 Browser에서 Web API로 동작하여 실행시킨 뒤 콜백을 Event Queue에 등록시킨다. 그 이후 Call Stack이 비게되면 이때 Event Queue에서 Call Stack으로 밀어주게 된다. 이를 EventLoop라고 부른다.

 

 

this.setState({myCabinet: "beer"});
console.log(this.stae.myCabinet);

 

위 코드를 실행시키면 알 수 있지만, console에서는 myCabinet이 "beer"로 안 바껴있음을 알 수 있다. beer를 얻기 위해서는 setState의 두 번째 인자에 callback 함수를 작성해야한다.

 

this.setState({myCabinet: "beer"}, () => console.log(this.state.myCabinet));

 

그렇다면 한 번쯤은 이런 생각을 할 것이다. async await를 사용해도 가능하지 않을까?

결론부터 말하자면, setState에서는 async await를 사용하면 안된다.

async/ await 의 기반은 promise다. async 함수는 promise를 반환하고 promise가 함수로부터 반환할 값을 resolve한다. setState는 promise를 반환하지 않기에 await와 함께 사용해서는 안된다.

 

그러면 어떠한 방식으로 사용해야할까?

updateState = (payload) => {
  return new Promise((resolve, reject) => {
    this.setState({
      sitename: payload
    }, () => {
      resolve('Updated')
    });
  });
};

 

showResult = async () => {
  let resultMsg = await this.updateState('webisfree');
  alert(resultMsg);
};

이런 식으로 Promise로 감싸서 사용해도 된다.

728x90

'FrontEnd > React Basics' 카테고리의 다른 글

Custom Hooks 예시  (0) 2021.02.13
useState 초기값  (0) 2021.02.13
Props & Event  (0) 2020.10.13
State & Event  (0) 2020.10.13
React Router  (0) 2020.10.13
Comments