비동기 작업을 하는 함수를 await 키워드를 사용하여 동기적으로 제어 할 수 있지만, 자주 사용하게 되면 처리 속도가 느려지기 때문에 비효율적 일 수 있다.
예를 들어,
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function getApple() {
await delay(3000);
return "apple";
}
async function getBanana() {
await delay(3000);
return "banana";
}
async function pickFruits2() {
const apple = await getApple(); //3초 기다리고 실행
const banana = await getBanana(); //3초 기다리고 실행
return `${apple} + ${banana}`;
}
pickFruits2().then(console.log);
getApple() 함수와 getBanana() 함수는 호출 할 때 서로 연관이 되어 있지 않기 때문에 기다릴 필요가 없다.
이 소스를 Promise의 특성을 이용하여 개선하게 되면 다음과 같다.
async function pickFruits2() {
const applePromise = getApple(); //Promise 객체 안 코드 블록 바로실행
const bananaPromise = getBanana(); //Promise 객체 안 코드 블록 바로실행
const apple = await applePromise;
const banana = await bananaPromise;
return `${apple} + ${banana}`;
}
getApple()과 getBanana() 함수를 호출 할 때 Promise 객체 안 코드 블록이 바로 실행 되기 때문에 3초 동안 두 함수가 비동기로 실행하게 되어 더 효율적이다.