js

[javascript] 비동기 async와 await, promise APIs

beaksul 2022. 9. 29. 17:07

1. async

function fetchUser(){
	// 백엔드에서 자료를 가지고 오는 데 10초 정도 걸리는 함수 (가정)
    return 'jiwon';
}

const user = fetchUser();
console.log(user);

// 위 코드를 비동기적 처리를 하지 않으면 사용자 정보를 가져오는데 10초가 소요됨

function fetchUser(){
	return new Promise((resolve, reject) => {
    	// 백엔드에서 자료를 가지고 오는 데 10초 정도 걸리는 함수 (가정)
    	resolve('jiwon');
    });
}

const user = fetchUser();
user.then(console.log);
console.log(user);

// 위 Promise코드를 async를 사용해서 바꾸면?!
async function fetchUser(){
	// 백엔드에서 자료를 가지고 오는 데 10초 정도 걸리는 함수 (가정)
    return 'jiwon';
}

// 결과값은 Promise를 사용한 것과 같음

 

 

 

2. await

async 안에서만 쓸 수 있음

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';
}

// 콜백지옥
function pickFruits(){
	return getApple().then(apple => {
    	return getBanana().then(banana => '${apple} + ${banana}');
    });
}

// async와 await 활용
function pickFruits(){
	const apple = await getApple();
    const banana = await getBanana();
    return '${apple} + ${banana}';
}

 

에러 발생시


function pickFruits(){
    try{
		const apple = await getApple();
    	const banana = await getBanana();
    } catch(){
    	
}
    
    return '${apple} + ${banana}';
}

 

병렬적으로 진행 돼야할 때 가능한 코드

// apple과 banana는 데이터를 받아올 때 연관되어 있지 않아서
// 서로 (딜레이 시간을) 기다릴 필요가 없음

function pickFruits(){
	const applePromise = getApple();
    const bananaPromise = getBanana();
	const apple = await applePromise();
    // 만들자마자 코드가 실행됨
    const banana = await bananaPromise();
    return '${apple} + ${banana}';
}

// 1초만에 병렬적으로 실행됨

 

 

3. 유용한 Promise APIs

 

.all

모든 promise들이 병렬적으로 데이터를 다 받을 때까지 모아줌

function pickAllfruits(){
	return Promise.all([getApple(), getBanana()]).then(fruits => 
    fruits.join('+')
    );
}

 

.race

promise로 전달된 배열 중 첫번째 과일만 받아오고 싶을 때

function pickOnlyOne(){
	return Promise.race([getApple(), getBanana()]);
}