async와 await은 약간 특별한 문법으로 볼 수 있는데, 기본적으로 프로미스(Promise)를 편하게 쓸 수 있고 한번 더 깔끔하게 줄일 수 있다.
async function() {
return 0;
}
//또는
async () => {
return 0;
}
위와 같이 function앞에 async를 붙히거나, 화살표 함수앞에 async를 붙혀서 사용할 수 있으며 async를 사용하면 해당 함수는 항상 프로미스를 반환한다.
const promise = await promise
자바스크립트는 기본으로 await를 만나면 프로미스가 처리될 때 까지 기다린다. 쉽게 말해 프로미스가 대기상태가 아닌 처리가 될 때 까지 await 이 있는 코드는 실행이 되지 않는다.
function findAndSaveUser(Users) {
Users.findOne({})
.then((user) => {
user.name = 'asdf';
return user.save();
})
.then((user) => {
return Users.findOne({ gender: 'm'})
})
.then((user) => {
// 생략
})
.catch(err => {
console.error(err);
})
}
위 코드는 await / async 문법을 쓰지 않은 콜백함수 코드이다. 위 코드를 await / async 문법을 써서 바꿀 수 있다.
async function findAndSaveUser(Users) {
let user = await Users.findOne({})
user.name = 'asdf'
user = await user.save();
user = await Users.findOne({ gender : 'm'})
// 생략
}
콜백을 바꾸니 코드도 확실히 짧아지고 보기에도 편해진 것을 알 수 있다. 함수 선언부앞에 async를 붙히고 Users.findOne() 앞에 await을 붙혀서 해당 프로미스가 resolve될 때까지 기다린 뒤 넘어간다.
지금은 간단하게 설명하고 넘어가는 것이라 나중에 직접 로그인기능 구현하고 CRUD 시스템을 구현하거나 하면서 더 많이 쓸 예정이니 그 때 새로운 것이 나오면 부가 설명을 할 것이다.