aync과 await을 사용해서 비동기 처리를 할 수 있으며, Promise 객체를 사용하는 것 보다 좀 더 간결하다.
function 앞에 쓰며, async를 붙이는 경우 항상 promise를 반환한다.
아래 예시와 같이 이행된 프라미스가 반환된다.
const myfunc = async () => {
return 'Good'
}
myfunc().then()
명시적으로 promise를 반환해서 쓸 수도 있다.
const myfunc = async () => {
return new Promise((resolve, reject) => {
resolve('Good!!!')
});
}
myfunc().then()
await은 async 함수에서만 작동하며, 비동기 처리 코드 앞에 쓴다. await를 만나면 promise 처리가 될 때까지 기다리고 결과는 이후 반환된다.
async function 함수명() {
await 비동기 함수명()
}
resultFunc()는 async 키워드를 앞에 붙여 promise를 반환하는 함수가 된다.
자바스크립트는 읽어가다가 await
를 만나면 promise가 이행될 때 까지 기다리므로 2초 뒤에 result가 출력된다.
function promiseFunc() {
return new Promise(function(resolve, reject) {
setTimeout(() => {
resolve('1,2,3')
},2000)
});
}
async function resultFunc() {
let result = await resultFunc(); //프라미스가 이행될 때 까지 기다린다.
console.log(result);
}
async / await 에러처리는 try-catch로 많이 처리한다.
const myfunc = (err) => {
console.log('Start');
return new Promise((resolve, reject) => {
setTimeout( () => {
if(!err) {
resolve()
} else {
reject()
}
},2000);
});
}
아래는 resolve()가 호출되어 이행 상태일 때 promise를 반환하기 때문에 2초 뒤에 hello1이 출력, 2초 뒤에 hello2가 출력, 2초 뒤에 hello3가 출력된다.
await을 만나면 이행될 때 까지 기다리는 특성 때문에 task3가 처리 되기까지 6초가 걸린다.
const run = async () => {
try {
const task1 = await myfunc(false);
console.log("hello1");
const task2 = await myfunc(false);
console.log("hello2");
const task3 = await myfunc(false);
console.log("hello3"); //<- 6초 걸림
console.log("hello3");
} catch(err) {
console.log(new Error('에러'));
}
}
run()
task1의 await은 작동이 되어 promise 이행이 끝나면 hello1을 출력하고, task2의 await을 실행시키는데 reject()를 불러와 실패 상태가 되므로 catch()의 에러 메세지를 반환하고 종료해버린다.
let run = async () => {
try {
const task1 = await myfunc(false);
console.log("hello1");
const task2 = await myfunc(true);
console.log("hello2");
const task3 = await myfunc(false);
console.log("hello3"); //<- 6초 걸림
console.log("hello3");
} catch(err) {
console.log(new Error('에러'));
}
}
run()
await 키워드 다음에 등장하는 함수 실행은, 어떤 타입을 리턴할 경우에만 의미가 있나요?
promise를 리턴해야만 의미가 있다.
await 키워드를 사용할 경우, 어떤 값이 리턴되나요?
Promise가 리턴된다.