728x90
728x90
Promise 객체
- 비동기적으로 실행되는 작업을 처리하고, 그 결과를 콜백 함수 등을 이용해 처리하는 객체
- 어떤 작업의 결과를 반환하는 객체
# Promise의 상태
1) 대기 (Pending)
: Promise 객체가 생성되었으나, 아직 처리가 진행되지 않은 상태
2) 이행 (Fulfilled)
: Promise 객체가 처리를 완료하여 결과를 반환한 상태
3) 거부 (Rejected)
: Promise 객체가 처리를 실패했거나, 오류가 발생한 상태
비동기 작업 처리
- 자바스크립트 엔진은 싱글 스레드로 동작함
▶ Call Stack
: 현재 실행 중인 함수를 기록하는 스택
· Java의 스택 메모리와 유사
▶ Message Queue (Task Queue)
: 비동기 작업이 완료되었을 때 등록되는 작업 목록
▶ Event Loop
: Call Stack과 Message Queue를 주시하면서,
Call Stack이 비어 있을 때 Message Queue에서 작업을 꺼내와 실행함
반응형
728x90
setTimeout() 함수 활용
# 예시 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | console.log("test3 start"); // resolve : // reject : let response = new Promise((resolve, reject) => { // 2초(2000ms) 뒤에 해당 코드가 실행되도록 함 setTimeout(() => { // Task Queue에 등록 console.log("통신 완료"); let data = 10; resolve(data); }, 2000); }); // 2초 뒤에 동작하는 setTimeout()보다 먼저 실행 // 값을 가져오지 못하고 Promise object 타입이라는 것만 받아와짐 console.log("값 : " + response); console.log("test3 end"); | cs |
# 예시 2
- 예약어 async
: 비동기 함수가 되기 위한 키워드
- 예약어 await
: Promise 타입이 처리될 때까지 기다리라는 키워드
→ 예시 1과 달리, setTimeout() 함수의 지연 시간이 끝난 후 값을 받을 때까지 기다리다가,
통신이 완료되고 Promise 객체에 값이 담기고 나면 코드가 실행됨
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | async function test4() { console.log("test4 start"); // await가 컴파일 시점에 확인됨 // await가 있으면 async라는 예약어를 function 앞에 반드시 지정해주어야 컴파일 시점 오류가 사라짐 let response = await new Promise((resolve, reject) => { setTimeout(() => { // Task Queue에 담김 console.log("통신 완료"); let data = 10; resolve(data); // 실행 }, 2000); }); // data를 받아와, 10이 출력됨 console.log("값 : " + response); console.log("test4 end"); } | cs |
비동기 통신의 기본 형식
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 31 32 33 34 | <button onclick="runAsyncTask()">Promise Callback Test</button> <script> function doAsyncTask() { return new Promise(function (resolve, reject) { let success = false; setTimeout(() => { // 여기 내부는 Task Queue에 저장 // 성공 시 if (success) { resolve("정상적으로 수행을 완료함"); // 해당 값 return // 실패 시 } else { reject("비정상적으로 동작을 처리함"); // 해당 값 return } }, 3000); }); } async function runAsyncTask() { console.log("test start"); // 예외 처리 try { // 비동기 함수 실행 const result = await doAsyncTask(); console.log(result); } catch (error) { console.log(error); } console.log("test end"); } </script> | cs |
320x100
반응형
'JavaScript' 카테고리의 다른 글
[JavaScript] 실행 환경 비교 (브라우저 vs node.js) (0) | 2023.08.03 |
---|---|
[JavaScript] 비동기 통신 : AJAX (0) | 2023.05.09 |
[JavaScript] AJAX 통신을 이용해서 데이터 가져오기 (0) | 2023.05.09 |
[JavaScript] toggle() 활용 예제 코드 (0) | 2023.05.08 |
[JavaScript] BOM : document 객체 ★ (0) | 2023.05.08 |