JavaScript 비동기 처리 방법(Promise, async, await)

 콜백(Callback)이란?

다른 함수를 파라미터로 받아서, 그것을 내부에서 호출하는 함수

function A(callback){
  callback();
}

function B(){
  console.log("콜백이지롱");
}

A(B);

함수 자체를 연결하는 것(함수 실행을 연결하는 것 아님)

함수의 실행이 끝나면 지정한 콜백함수를 실행해 주도록 함수에 요청할 때 사용

 

위의 사진처럼 콜백함수 여러 개를 중첩한다면?

-> 가독성이 너무 안좋아짐.. 이런 걸 콜백 지옥이라고 부름

 

콜백지옥을 어떻게 해결하는지 알아보자!


• Promise

- Promise는 비동기 작업의 단위

- 미래에 어떤 종류의 결과가 반한됨을 약속(Promise)해주는 Object!

const promise1 = new Promise((resolve, reject) => {
  //비동기 작업
});
  • 생성자는 첫 번째 인자로 resolve, 두 번째 인자로 reject를 받음
  • resolve와 reject는 executor 내에서 호출할 수 있는 또 다른 함수
    -> 성공하면 resolve, 실패하면 reject 호출
  • Promise가 끝나고 resolve가 호출되면 then이 실행되고, reject가 호출되면 catch가 실행됨
  • then과 catch는 인자로 함수를 받음
  • resolve와 reject에 넣어준 인자는 각각 then과 catch의 매개변수에서 받을 수 있음
const promise1 = new Promise((resolve, reject) => {
  resolve();
});

promise1
  .then(() => {
    console.log("then!");
  })
  .catch() => {
    console.log("catch!");
  });

- 위의 코드 실행 결과는?

resolve()가 호출되었으므로 then!이 출력


• async / await

- Promise를 조금 더 편하게 사용할 수 있도록 해줌

async function printAnimals(){
  const animals = await getAnimals();	*
  console.log(animals);
}

*이 표시된 줄에서 실행이 잠시 중단되고 Promise 처리되면 실행 재개

 

위의 코드에서 async/await를 사용하지 않았다면?

getAnimals()의 수행시간이 길어서 콘솔창에 undefined가 출력되었을 것임

 

async

async 키워드는 function 앞에 사용

리턴 값은 항상 Promise

 

∘ await

async 함수 안에서만 동작

Promise가 처리될 때까지 기다리는 역할

(Promise 처리를 기다리는 동안 엔진이 다른 일을 할 수 있음)

 

∘ 예외처리

Promise에서는 .catch로 예외처리를 했지만, async/await에서는 try ~ catch 를 사용함

async function loadData() {
	try {				//성공했을때
    	const result = await getData();
        console.log(result);
     } catch(e) {			//실패했을때
     	console.log(e);
     }
}

loadData();

• 결론!

 

async/await를 사용하면 await가 대기를 처리해줘서 .then이 거의 필요하지 않음

.catch 대신 일반 try~catch를 사용할 수 있다는 것도 장점임

대부분 Promise 방식보다 async/await 방식을 사용하는 것이 더 편리함!

 

'JavaScript' 카테고리의 다른 글

JavaScript DOM  (0) 2023.05.16
JavaScript Hoisting(호이스팅)  (0) 2023.05.15
JavaScript 동기/비동기(동작 원리)  (0) 2023.05.03
JavaScript란?  (0) 2023.05.03
JavaScript 기본 문법  (0) 2023.04.29