Promise는 비동기 작업이 나중에 성공하거나 실패할 결과를 나타내는 객체다(ECMAScript 2015, ES2015). 콜백을 중첩하는 대신 .then() 체인이나 async/await로 비동기 흐름을 순서대로 쓸 수 있게 해 준다.
- 상태는
pending에서fulfilled(성공) 또는rejected(실패) 중 하나로 한 번만 바뀐다 new Promise(executor)의 executor는 생성하는 순간 동기적으로 실행된다.then을 붙이기 전에 이미 돈다then은 새 Promise를 반환해서 체이닝이 된다.catch는 실패를,finally는 결과와 상관없는 정리(로딩 해제 등)를 맡는다resolve를 끝내 부르지 않으면 영원히 pending이다. 그래도 스레드나 CPU(Central Processing Unit)를 붙잡지는 않는다. 상태를 가진 객체 하나가 남을 뿐이고, 참조가 없으면 GC(Garbage Collection) 대상이 된다await는 스레드를 멈추지 않는다. 현재 async 함수의 남은 부분만 멈춰 두고, Promise가 끝나면 마이크로태스크(Microtask)로 이어서 실행한다. 그동안 다른 코드는 계속 돈다(이벤트 루프)async/await는 Promise 위의 문법이다.async function f() { return 1 }은Promise.resolve(1)을 반환하는 것과 같다
| API(Application Programming Interface) | 끝나는 조건 |
|---|---|
Promise.all | 모두 성공(하나라도 실패하면 즉시 실패) |
Promise.allSettled | 모두 끝남(성공·실패 결과 배열) |
Promise.race | 가장 먼저 끝난 것(타임아웃 구현) |
Promise.any | 가장 먼저 성공한 것 |
React에서 Promise를 렌더 중에 읽는 방법은 use()로 Promise 읽기, 파이썬의 비슷한 함정은 asyncio 태스크 예외가 조용히 사라지는 문제에 있다.