공부/javascript
[ javascript ]async / await
신입개발자
2021. 6. 29. 05:27
async/await 란?
async/await 는 javascript에서 promise를 더욱 쉽게 사용할 수 있도록 서포트해주는 문법입니다
// promise 를 만드는 함수
function sleep(ms){
// 파라미터 ms 이후에 resolve를 호출해 promise가 끝이납니다
return new Promise(resolve => setTimeout(resolve, ms));
}
// async / await 문법을 사용할때는 앞에 async 표기
async function process(){
console.log('안녕하세요;');
// promise의 앞부분에 await를 붙여줘야합니다
// promise를 기다리는 작업을.then 을 쓸필요가 없어집니다
await sleep(1000);
// 안녕하세요 출력후 1초뒤에 '반갑습니다' 출력
// async /await 문법을 사용시 분기점을 만드는것도 쉽고 변수를 공유하는것도 쉽습니
console.log('반갑습니다');
}
process();
async / await 문법을 사용한 함수를 사용하게 된다면 결과물은 프로미스에 반환하게 됩니다
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
async function process(){
console.log('안녕하세요;');
await sleep(1000);
console.log('반갑습니다');
return true;
}
process().then(value => {
console.log(value); // true
});
만약에 promise에서 에러를 발생하고 싶으면 throw 사용하고 에러를 잡아내고 싶을때는 try catch를 사용하면 됩니다
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
async function makeError(){
await sleep(1000);
// 변수 error 에 에러 생성자 함수를 담습니
const error = new Error();
// 에러 발생
throw error;
}
async function process(){
// 에러를 잡아낼때는 try catch 사용
try {
await makeError();
// catch 의 매개변수인 e는 makeError에서 생성된 error입니다
} catch (e){
console.log(error);
}
}
process().then(value => {
console.log(value); // true
});
다른 예제
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
const getDog = async () => {
await sleep(1000); // 1초
return 'Dog';
}
const getRabbit = async () => {
await sleep(500); // 0.5초
return 'Rabbit';
}
const getTurtke = async () => {
await sleep(3000); // 3초
return 'Turtle';
}
async function process(){
const dog = await getDog();
console.log(dog);
const rabbit = await getRabbit();
console.log(rabbit);
const turtle = await getTurtke();
console.log(turtle);
/* 출력순서
'dog'
'rabbit'
'turtle'
*/
}
process();
/*
dog, rabbit, turtle 는 순서대로 실행이 됩니다
여기서 한번에 처리하는 방법이 Promise all 입니다
*/
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
const getDog = async () => {
await sleep(1000); // 1초
return 'Dog';
}
const getRabbit = async () => {
await sleep(500); // 0.5초
return 'Rabbit';
}
const getTurtke = async () => {
await sleep(3000); // 3초
return 'Turtle';
}
async function process(){
// Promise가 모두 끝나면 Promise의 반환값은 dog, rabbit, turtle의 결과값이 담긴 배열을 반환합니다
const result = await Promise.all[getDog(), getRabbit(), getTurtke()];
console.log(result); // ['dog', 'rabbit', 'turtle'] 총 걸린 시간은 turtle로 인해 3초입니다
}
process();
// 배열의 값들을 꺼내서 변수에 넣고 싶을때
async function process(){
const result = await Promise.all([getDog(), getRabbit(), getTurtke()]);
const dog = result[0];
const rabbit = result[1];
const turtle = result[2];
}
// 비구조화 할당 적용
async function process(){
const [dog, rabbit, turtle] = await Promise.all[getDog(), getRabbit(), getTurtke()];
}
// Promise.race
// Promise.race 는 Promise.all과 비슷합니다 다른점은 Promise.all 처럼 한번에 실행되지만
// 가장 빨리 끝난 promise만 반환합니다
async function process(){
const first = await Promise.race([getDog(), getRabbit(), getTurtke()]);
console.log(first);// rabbit
}