공부
[JS] 비동기 - Callback, Promise, async/await
hahihuree
2021. 9. 24. 07:04
자바스크립트 비동기 처리 방법
1. Callback
- 자바스크립트의 비동기 처리 패턴 중 하나.
- 비동기 결과의 값을 가지고 다른 비동기 작업을 하는 등 중첩이 되는 문제가 있음.
- 이를 콜백헬 또는 멸망의 피라미드라고 하는데 관리가 어려워지는 등 문제때문에 ES6에서 Promise 도입.
2. Promise
- 자바스크립트 비동기 연산이 종료된 이후에 처리 결과를 알기 위해 사용되는 객체.
- Promise생성자 함수를 통해 생성하고, 비동기 작업을 수행할 콜백함수를 인자로 받아 사용함.
// Promise만들기
const promise = new Promise((resolve, reject) => {
if(...){
...
resolve("성공!");
}else{
...
reject("실패!");
}
});
- 비동기를 호출하는 측에서는 Promise의 후속처리 메소드를 사용해서 처리해야함.
- .then (성공시, 실패시)
- then의 첫 인자는 성공시 실행, 두번째 인자는 실패시 실행.(첫번째 인자만 넘겨도 됨)
- Promise 상태값
- pending: 비동기 처리 수행 전
- fulfilled: 성공(resolve 호출)
- rejected: 실패(reject 호출)
- settled: 성공 or 실패(resolve나 reject가 호출된 상태)
- callback헬을 Promise로 해결: Promise chanining(프라미스 체이닝)
- 후속처리 메서드 .then을 여러개 연결해 사용
-
new Promise((resolve, reject) => { setTimeout(() => resolve("promise 1"), 1000); }).then((result) => { // 후속 처리 메서드 하나를 쓰고, console.log(result); // promise 1 return "promise 2"; }).then((result) => { // 이렇게 연달아 then을 써서 이어줌. console.log(result); return "promise 3"; }).then(...);
- 여기서는 Promise가 하나지만, 여러개 만들어서 사용가능 함.
- 일이 a,b,c라면 각각 Promise객체로 만들고,
- 후속 메소드 안에 Promise로 만든 비동기 작업 a,b,c를 .then으로 엮어주면 됨.
3. async/await
- Promise 사용을 편하게 만들어 주는 문법.
- async는 function 앞에 위치하고 해당 함수는 항상 Promise를 반환.
- Promise가 아닌 것은 Promise로 감싸서 반환.
- await는 async함수 안에서만 동작.
- 자바스크립트는 await를 만나면 Promise가 처리될 때까지 기다린 후 결과 반환.
-
async function myFunc(){ let promise = new Promise((resolve, reject) => { setTimeout(() => resolve("완료!"), 1000); }); console.log(promise); let result = await promise; //fulfilled가 될때까지 기다림 console.log(promise); console.log(result); //.then을 쓰지 않았지만 1초 후에 완료!가 콘솔에 찍힘 }
실제 코드 작성시에는 Axios나 fetch를 통해 요청을 하면 자동으로 Promise를 반환해 주기 때문에 Promise객체를 직접 생성하는 것보다 Promise로 반환된 객체들을 async/await를 사용해 비동기 처리하는 경우가 대부분.
참고: 스파르타코딩클럽 리액트 심화반