Post

async & await

async & await

비동기적으로 사용할 때 콜백함수를 이용했다 하지만 콜백 함수가 계속 반복되면(콜백지옥) 가독성도 떨어지고 작성하기도 힘들어진다 여기서 나온것이 Promise를 이용한 async & await이다

 

async & await 사용 이유

1
2
3
4
5
6
7
8
9
timer(1000,function(){
  console.log("1");
  timer(1000,function(){
    console.log("2");
    timer(1000,function(){
      console.log("3");
    });
  }); 
});

위 코드에서 timer가 3번만 나왔지만 더 반복되면 코드가 보기 어려워진다(콜백 지옥)

promise를 이용 할 수도 있다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function timer(time){ //Promise를 반환
        return new Promise(function(resolve){
            setTimeout(function(){
                resolve(time);
            },time);
        });
    }//time 이후 실행
timer(1000)
  	.then(function(){
  	console.log("1");
  	return timer(1000);
})
  	.then(function(){
  	console.log("2");
  	return timer(1000);
})
  	.then(function(){
  	console.log("3");
  	return timer(1000);
})

promise를 이용해서 then으로 체이닝을 통해 처리했지만 then을 연쇄적으로 사용하고 있어서 오류가 나온다면 몇번째 then에서 나온건지 파악이 어렵다 또한 catch를 통해서 예외 처리를 해야하는데 예외처리가 알기 어렵게 되거나 누락하는 경우가 생긴다

 

1
2
3
4
5
6
7
8
9
10
//async & await 사용
async function run(){
  await timer(1000);
  console.log("1");
  await timer(1000);
  console.log("2");
  await timer(1000);
  console.log("3");
}
run();

async와 await를 이용하면 같은 결과를 더 보기 쉽게 나타낼수 있다 또한 async & await 사용하면 비동기 코드를 동기 코드처럼 보기게 할 수 있다

 

 

 

async와 await 사용

async 함수

async는 항상 함수 앞에 위치한다 함수 앞에 위치하면서 그 함수는 항상 promise를 반환한다

1
2
3
4
5
async function f() {
  return 1;
}

f().then(alert); // 1 promise 값이 아니더라도 promise로 반환하는걸 확인할 수 있다 

또한 await는 항상 async함수 안에서만 동작한다

 

await

await를 만나면 promise가 처리 될때까지 기다린다 기다린 이후에 값이 반환된다

1
2
3
4
5
6
7
8
9
10
11
12
async function f() {

  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("완료!"), 1000)
  });

  let result = await promise; // 프라미스가 이행될 때까지 기다림 (*)

  alert(result); // "완료!"
}

f();

함수를 호출하면 await에서 promise가 처리될 때까지 기다린다음 처리된다(1초) result에는 “완료”가 들어간다

await시간 동안 엔진이 다른일을 처리할 수 있어 리소스가 낭비되지 않는다

 

 

에러 처리

promise가 정상적으로 처리되면 await promise의 result에 저장된 값을 반환한다 만약 거부 된다면 throw처럼 에러가 던져진다

에러를 try/catch를 이용해서 잡을 수 있다

1
2
3
4
5
6
7
8
9
10
11
12
async function f() {

  try {
    let response = await fetch('http://유효하지-않은-주소');
    let user = await response.json();
  } catch(err) {
    // fetch와 response.json에서 발행한 에러 모두를 여기서 잡습니다.
    alert(err);
  }
}

f();

try/catch가 없다면 promise에러가 발생한다

This post is licensed under CC BY 4.0 by the author.