- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 항해99
- rtk
- 에러
- Coin
- react
- 리액트
- error
- 차트만들기
- 비전공자
- graphql
- typeorm
- nestjs
- Flutter
- 차트구현
- 코인차트
- javascript
- Redux
- nextjs
- 채팅
- 코인
- 3주차
- websocket
- API
- 주식
- apollo
- Firebase
- typescript
- chart
- 차트
- 주식차트
Act99 기술블로그
항해99 3주차 / Callback & Promise 본문
자바스크립트는 싱글 쓰레드로 동작하는 언어입니다. (메인 쓰레드 하나와 콜스택 하나로 구성되어 있어요!)
그리고 비동기 작업을 동시에 할 수 있어요. 1번에 1개의 작업만 할 수 있는데, 어떻게 동시 실행을 할까요?
→ 자바스크립트는 코어 엔진만 가지고 돌아가지 않아요!
실행환경(런타임)의 도움을 받아 동시 실행을 합니다.
(WebAPI(dom, ajax, setTimeout...), Task Queue, Event Loop 등과 함께 동작합니다.)
Callback
콜백은 자바스크립트가 비동기 처리를 하기 위한 패턴 중 하나며, 콜백 헬, 멸망의 피라미드라고 불리는 엄청난 중첩 문제가 생기기 쉽다.
이런 콜백 헬이 발생하는 이유는
1. 비동기 처리 시에는 실행 완료를 기다리지 않고 바로 다음 작업을 진행하기 때문
2. 순서대로 코드를 쭉 적는다고 우리가 원하는 순서로 작업이 이뤄지지 않음
3. 비동기 처리 함수 내에서 처리 결과를 반환하는 걸로는 원하는 동작을 하지 않으니, 콜백 함수를 사용해 원하는 동작을 하게 하려고 콜백 함수를 씀
4. 이런 콜백 함수 내에서 또 다른 비동기 작업이 필요할 경우 위와 같은 중첩이 생기면서 콜백 헬이 탄생한다.
Promise
비동기 연산이 종료된 이후 결과를 알기 위해 사용하는 객체입니다. 프로미스를 쓰면 비동기 메서드를 마치 동기 메서드처럼 값을 반환할 수 있습니다. 전통적인 콜백 패턴으로 인한 콜백 헬 때문에 ES6에서 도입한 또 다른 비동기 처리 패턴입니다. 비동기 처리 시점을 좀 더 명확하게 표현할 수 있습니다.
1. 프로미스 생성
- 프로미스는 Promise 생성자 함수 (new Promise())를 통해 생성합니다.
- 비동기 작업을 수행할 콜백 함수를 인자로 전달받아서 사용합니다.
const promise = new Promise((resolve, reject) => {
if(...){
...
resolve("성공!");
}else{
...
reject("실패!");
}
});
1. 프로미스 객체를 만듭니다.
2. 인자로는 (resolve, reject) => {} 이런 excutor 실행자 (혹은 실행함수)를 받습니다.
3. 이 실행자는 비동기 작업이 끝나면 바로 두 가지 콜백 중 하나를 실행합니다
(reslove => 작업이 성공한 경우 호출할 콜백 / reject => 작업이 실패한 경우 호출할 콜백)
2. 프로미스의 상태값
- pending: 비동기 처리 수행 전 (reslove, reject가 아직 호출되지 않음)
- fulfilled: 수행 성공 (resolve 가 호출된 상태)
- rejected: 수행 실패 (reject가 호출된 상태)
- settled: 성공 or 실패 (resolve 나 reject가 호출된 상태)
3. 프로미스 후속 처리 메서드
- 프로미스로 구현된 비동기 함수는 프로미스 객체를 반환합니다
- 프로미스로 구현된 비동기 함수를 호출하는 측에서는 이 프로미스 객체의 후속처리 메서드를 통해 비동기 처리 결과 (성공 결과나 에러메시지)를 받아서 처리해야 합니다.
- .then(성공 or 실패 시)
then의 첫 인자는 성공 시 실행, 두 번째 인자는 실패 시 실행됩니다.
예시코드
// 프라미스를 하나 만들어 봅시다!
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("완료!"), 1000);
});
// resolve
promise.then(result => {
console.log(result); // 완료!가 콘솔에 찍힐거예요.
}, error => {
console.log(error); // 실행되지 않습니다.
});
// 프라미스를 하나 만들어 봅시다!
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("오류!")), 1000);
});
// reject
promise.then(result => {
console.log(result); // 실행되지 않습니다.
}, error => {
console.log(error); // Error: 오류!가 찍힐거예요.
});
- 실패 시 .catch
// 프라미스를 하나 만들어 봅시다!
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("오류!"), 1000);
});
promise.catch((error) => {console.log(error};);
4. Promise chaining
1. 프로미스는 후속 처리 메서드를 체이닝해서 여러 개의 프로미스를 연결할 수 있습니다. 이것으로 콜백 헬을 해결할 수 있습니다.
- 체이닝이란 후속 처리 메서드 (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(...);
5. async, await
1. async
- 함수 앞에 async를 붙여서 사용합니다.
- 항상 프로미스를 반환합니다. (프로미스가 아닌 값이라도, 프로미스로 감싸서 반환해줍니다.)
// async는 function 앞에 써줍니다.
async function myFunc() {
return "프라미스를 반환해요!"; // 프라미스가 아닌 걸 반환해볼게요!
}
myFunc().then(result => {console.log(result)}); // 콘솔로 확인해봅시다!
2. await
- async 함수 안에서만 동작합니다.
- await은 프로미스가 처리될 때까지 기다렸다가 그 이후에 결과를 반환합니다.
async function myFunc(){
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("완료!"), 1000);
});
console.log(promise);
let result = await promise; // 여기서 기다리자!하고 신호를 줍니다.
console.log(promise);
console.log(result); // then(후처리 함수)를 쓰지 않았는데도, 1초 후에 완료!가 콘솔에 찍힐거예요.
}
await을 만나면, 실행이 잠시 중단되었다가 프로미스 처리 후에 실행을 재개합니다. 즉, await을 쓰면 함수 실행을 기다리게 하는 것입니다.
'개발팁저장소' 카테고리의 다른 글
항해99 3주차 / 웹 저장소 (feat. 토큰) (0) | 2022.02.01 |
---|---|
항해99 3주차 / 토큰 기반 인증 (0) | 2022.02.01 |
항해99 3주차 리액트 입문 전 알아야 할 기본 개념 (0) | 2022.01.25 |
Javascript - 배열을 합칠 때 중복 제거하는 방법 / set /// 기타내용 (0) | 2022.01.25 |
항해99 2주차 알고리즘 기간 (0) | 2022.01.20 |