Promise를 사용한 sleep 구현
const sleep = (time: number) => {
return new Promise((res) => {
setTimeout(res, time);
})
}
Promise는 약속이다. javascript에서 시간이 오래 걸리는 로직(IO 작업)이 발생하면 이를 이벤트 큐에 삽입하고, 작업이 완료되면 결과를 받아볼 수 있게 한다.Promise는 메인 쓰레드에게 말한다. '시간이 오래 걸리는 작업이 있으니 이것은 이벤트 큐에 넣어 완료될 때 까지 기다릴게. 완료되면 너가 받아 볼 수 있게 해줄게'Promise에게 위임하고, 나중에 작업이 완료되면 Promise가 이를 메인 쓰레드에게 알려 결과를 받아볼 수 있게 한다.Promise는 이 작업이 완료되면 메인 쓰레드에게 알린다.Promise 는 이 두가지 문제를 해결한다function foo(flag: boolean) {
return new Promise((res, rej) => {
if(flag) {
res('suc');
} else {
rej('fail');
}
})
}
foo(true).then((res) => {
console.log(res);
}, (rej) => {
console.log(rej);
});
foo(false).then((res) => {
console.log(res);
}, (rej) => {
console.log(rej);
});
2개의 인자를 받는 익명함수를 생성자의 인자로 받는다.resolve, reject라고 지칭된다.reject가 실행되며, 정상 실행의 경우 resolve가 실행된다.then 구문을 사용하여 결과를 받아볼 수 있다.then 구문의 로직은 호출된 함수와 Promise 내부의 함수 로직이 모두 마무리 되면 실행된다.then 구문은 onFulfilled, onRejected 라는 2개의 함수를 인자로 받으며, 각 함수는 하나의 인자를 받는다.resolve가 호출되었을 때 실행되며, 두번째 인자로 들어가는 함수는 reject가 호출되었을 때 실행된다.resolve와 reject가 실행될 때 input으로 들어가는 값은 onFulfilled, onRejected의 인자로 전달된다.foo 함수에 true를 input으로 넣으면 함수 내부에서 flag 값에 의해 res로 지칭된 함수가 실행되며, false를 넣으면 rej가 실행된다.res, rej 가 실행되면서 input으로 넣어지는 인자는 then 구문의 인자로 전달된다.foo에 true를 전달하면 'suc'가 출력되며, false를 전달할 경우 'fail'이 출력된다.resolve와 reject의 호출을 나뉘었다.function doError() {
return new Promise((res, rej) => {
throw new Error('throw error');
});
}
doError().then((res) => {
console.log('success');
}, (rej) => {
console.log('catch error');
})
doError 함수는 error를 throw하는 Promise를 반환한다.reject가 실행된다고 했다.reject가 실행되면, then 구문에서는 onRejected 가 실행된다고 했다.reject가 실행되며, 이를 호출하는 부분에서는 onRejected를 실행한다.catch error가 출력된다.const sleep = (time: number) => {
return new Promise((res) => {
setTimeout(res, time);
});
}
sleep(3000).then((res) => {
console.log('foo');
})
then 구문으로 결과를 받아본다.resolve를 실행시키므로, then 구문에서는 onFulfilled를 실행하게 된다.then 구문의 onFulfilled 부분이 실행되며, 3초 후 'foo' 가 출력된다.틀린내용 혹은 수정이 필요한 부분이 있으면 말씀해 주시기 바랍니다.