2019-8-28 Async Await을 이용한 비동기 처리

  • 지난번에 프로젝트를 하면서 비동기에서 비동기를 호출해서 undefined가 되는 이슈가 생겼었다. 옆에 친구가 Async Await과 Promise.all을 사용해서 도와줬었다. 똑같은 이슈가 발생을 해서 오늘은 내가 해결을 해보았다.

코드수정전

// Controller
router.get('/:email', (req, res) => {
  console.log('결과1');
  res.json(UserService.getUserByEmail(req.params.email));

});

// UserService
const getUserByEmail = (email) => {
  console.log('결과2');
  return UserRepository.getUserByEmail(email);
}

// UserRepository
const getUserByEmail = (email) => {
  const user = User.find({email: email})
  .then((user) => {
      console.log('결과3');
      return user;
    });
  .catch((err) => console.err(err));
}

//result
결과2
결과1
결과3
  • UserRepository에서 응답을 받고, UserService로 넘기고 Controller에서 응답을 해줘야되는데, UserRepository애서 비동기 응답으로 인해 그냥 undefined가 리턴이 되어서 값이 안나왔다.
  • 해결하기 위해서는 UserRepository에서 결과가 나올때까지 기다려야됬다. promise와 async awiat을 이용하기로 했다.

코드수정후

// Controller
router.get('/:email', (req, res) => {
  const result = UserService.getUserByEmail(req.params.email);
  result
    .then((user) => {
      res.json(user);
    })
    .catch((err) => res.end(err));
});

// UserService
async function getUserByEmail(email) {
  const user = await UserRepository.getUserByEmail(email);
  return user;
}

// UserRepository
async function getUserByEmail(email) {
  const user = User.find({email: email});
  console.log(user);
  return user;jae
}
  • getUserByEmail함수를 함수선언식으로 변경을 하고 async를 붙임으로서 async함수로 선언을 했다. 함수표현식이나 화살표 함수를 사용하고 싶었는데, 우선은 급한대로 함수선언식으로 해결을 했다.
  • UserService의 getUserByEmail에서 await을 붙여서 UserRepository에서 응답이 올때까지 기다린다. 그리고 return을 해준다.
  • Controller에서 응답이 오면 res.json으로 응답을 해주고, 아니면 에러를 res.end를 해주는 형태로 반환을 했다.

느낀점

  • 그래도 전에 비슷한 경험이 있어서 console.log(‘결과’);를 찍어봤을때 비동기처리에 대해서 알 수 있었다. 지난번에는 비동기 이슈가 발생했을때 Promise가 필요해서 promise에 대해서 학습을 했는데, 이번에는 비동기 이슈가 async await으로 활용해서 한번 적용해 볼 수 있어서 좋았다.
  • 또한 함수표현식과 화살표함수에서 async를 어떻게 쓰는지도 찾아보게 되었다. ``` const foo = async () => { // do something }

var add = async function(x) { // async function 표현식을 변수에 할당 var a = await resolveAfter2Seconds(20); var b = await resolveAfter2Seconds(30); return x + a + b; };

```

  • 위의 형태로 개션을 해보아야겠다.
Written on August 28, 2019