[ JavaScript ] JS async와 await
- asyncd와 await
async와 await는 기존의 비동기 처리 방식인 콜백 함수와 프로미스의 단점을 보완하기 위해 나온 문법입니다.
- async와 await 사용하기
async function 함수명() {
await 비동기처리 메서드();
}
함수 앞에 async 예약어를 붙이고 비동기 처리를 해야 하는 코드를 await앞에 붙이면 됩니다.
async function findAndSaveUsers(Users){
//생략
}
findAndSaveUsers().then(()=> { /*생략*/ });
// 혹은
async function other(){
const result = await findAndSaveUsers();
}
하지만 비동기 처리 메서드가 프로미스 객체를 반환하지 않는다면 await가 의도한 대로 동작 안 하기 때문에
꼭 Async 함수는 항상 promise를 반환해야 합니다.
function fun1() {
return new Promise(function(resolve, reject) {
let num = 10;
resolve(items)
});
}
async function fun2() {
var result = await fetchItems();
console.log(result); // 10
}
위의 예시에서 fun1() 함수는 프로미스 객체를 반환해주는 함수입니다.
fun1() 함수가 실행되면 프로미스가 Resolved로 이행되며 결과 값은 num변수가 됩니다.
fun2() 함수를 실행하면 fun1() 함수의 결괏 값인 num 변수가 result 변수에 담기면서 console.log(result); 의 출력 값은 10이 됩니다.
여기서 await를 사용하지 않으면 전 포스팅에서 배웠던. then()을 사용하거나 콜백 함수를 사용했어야 합니다.
하지만 async와 await 문법을 사용하게 되면 쉽고 간결한 코드를 짤 수 있을 것입니다.
- async & await 예외처리 하기
프로미스에서는 에러 처리를 위해. catch()를 사용했었습니다.
async function fun1(Users){
try{
let user = await Users.findOne({});
user.name = 'fu11_m00n';
user = await user.save();
user = await Users.findOne({gender : 'm'});
}
catch(error){
console.error(error);
}
}
async에서는 try catch 문법을 사용하여 예외처리를 할 수 있습니다.
위와 같이 코드를 실행하다가 통신 오류가 생기거나 다양한 오류가 생겼을 때 catch문으로 잡아내어 에러를 처리할 수 있습니다.
ref
Node.js 교과서: 기본기에 충실한 Node.js 10 입문서.
joshua1988.github.io/web-development/javascript/js-async-await/