참고자료 : [인간 JS 엔진 되기 - ZeroCho ]
setTimeout(() => {
console.log('a');
}, 0);
setTimeout(() => {
console.log('b');
}, 0);
setTimeout(() => {
console.log('c');
}, 0);
// a b c
일반적인 비동기 콜백
setTimeout(() => {
console.log('a');
}, 1000);
promise
const a = new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 1000);
});
const b = a.then((res) => {
console.log(res);
});
b.then(() => {});
const p1 = axios.get('url');
const p2 = axios.get('url');
const p3 = axios.get('url');
const p4 = axios.get('url');
const p5 = axios.get('url');
const p6 = axios.get('url');
Promise.all([p1, p2, p3, p4, p5, p6])
.then((results) => {})
.catch((error) => {}); // 여기서의 catch는 promise.all과 then까지 포함된 catch다.
Promise.allSettled([p1, p2, p3, p4, p5, p6])
.then((result) => {})
.catch((error) => {})
.finally(() => {});
let a = 2;
const p = new Promise((resolve, reject) => { // new Promise의 익명함수가 바로 호출된다.
console.log('good'); // promise 내부의 동기 코드
setTimeout(() => { // 비동기 코드, 호출 스택이 비워졌을 때 실행
a = 5;
console.log(a);
resolve(a);
}, 0);
});
console.log('hi');
p.then((result) => {
// then은 이벤트 리스너처럼 생각하는게 편하다. 이벤트 루프 백그라운드로 이동
// then이 호출 스택에 불리기 위한 조건은 resolve가 호출되는 것. 그 전까지는 web api에서 대기
console.log('result', result);
});
// result
// good hi 5 result,5
async function a() {
console.log('good')
const a = await 1; // await > then으로 치환해서 생각하면 편함
console.log('a', a);
console.log('hi');
await null;
const b = await Promise.resolve(1);
console.log('b',b);
}
// good
// a 1
// hi
// b 1
promise로 변환해서 생각해보기
console.log('good')
Promise.resolve(1)
.then((a) => {
console.log('a', a);
console.log('hi');
return null;
})
.then(() => {
return Promise.resolve(1);
})
.then((b) => {
console.log('b',b);
});