setTimeout 함수의 콜백 함수에서 상위 스코프의 변수에 값을 할당함setTimeout 함수는 콜백 함수를 호출 스케줄한 다음, 타이머 id 반환 후 즉시 종료됨setTimeout 종료된 이후에 동작함let g = 0;
setTimeout(() => { g = 100; }, 0);
console.log(g); // 0
try {
setTimeout(() => { throw new Error('Error!'); }, 1000);
} catch (e) {
// 에러를 캐치하지 못함
console.error('캐치한 에러', e);
}
setTimeout 는 실행 컨텍스트 생성 후 콜 스택에 푸시되어 실행setTimeout 함수는 콜 스택에서 제거된 상태setTimeout 가 아님setTimeout 함수의 콜백 함수가 발생시킨 에러는 setTimeout의 catch에서 캐치되지 않음Promise는 ECMAScript 사양에 정의된 표준 빌트인 객체 (호스트 객체 아님)Promise 생성자 함수는 비동기 처리를 수행할 콜백 함수를 인수로 전달 받음 executor 함수resolve, rejectpending : 아직 수행되지 않은 상태 (프로미스 생성 직후 기본 상태)settled : 성공/실패 여부와 무관하게 pending이 아닌 비동기 처리가 수행된 상태fulfilled : 성공 -> resolve 함수 호출rejected : 실패 -> reject 함수 호출settled 상태가 되면 다른 상태로 변화할 수 없음
then(callback1, callback2)callback1 : fulfilled 상태가 되면 호출, 프로미스의 비동기 처리 결과를 인수로 전달 받음callback2 : rejected 상태가 되면 호출, 프로미스의 에러를 인수로 전달 받음catch(callback)rejected 상태인 경우만 호출then(undefined, onRejected) 동일하게 동작finally(callback)catch 메서드 호출시 내부적으로 then(undefined, onRejected) 호출catch 메서드 사용 권장 (then 메서드의 두 번째 콜백 함수 X)then 메서드 호출 이후에 catch 호출하면 then 내부에서 발생한 에러까지 모두 캐치 가능async/await 사용 가능fulfilled 상태가 되면 처리 결과를 순서대로 배열에 저장해 프로미스로 반환request1의 3초보다 조금 더 소요됨rejected 상태가 되면 즉시 종료Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 1000)),
])
.then([response1, response2, response3] =>
console.log(response1, respone2, respone3)) // 1, 2, 3
.catch(console.error);
fulfilled 상태가 된 프로미스의 처리 결과를 프로미스 반환rejected 상태가 되면 즉시 종료Promise.race([
new Promise(resolve => setTimeout(() => resolve(1), 3000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 1000)),
])
.then(console.log) // 3
.catch(console.error);
settled 상태가 되면 처리 결과를 배열로 반환 fulfilled 상태 : value 프로퍼티rejected 상태 : reason 프로퍼티Promise.allSettled([
new Promise(resolve => setTimeout(() => resolve(1), 3000)),
new Promise((_, reject) => setTimeout(() => reject(new Error('Error!')), 2000)),
])
.then(console.log)
/*
[
{ status: "fulfilled", value: 1 },
{ status: "rejected", reason: Error: Error! }
]
*/
fetch(url [, options])Response 객체를 래핑한 프로미스 객체 반환Response 객체가 가지고 있는 메서드 사용 가능Response 객체의 ok=false 로 설정하여 resolve 반환reject 반환ok 상태 추가 체크 필요axios는 모든 에러를 catch 처리 가능하므로 권장[출처] 모던 자바스크립트, Deep Dive