JS 강의 필기 + 추가
JS is synchronous.
Execute the code block by order after hoisting
callback function을 중첩하면 가독성이 떨어지고 유지 보수가 용이하지 않음
console.log('1');
setTimeout(() => {
console.log(2);
}, 1000); // 1초 뒤 콜백함수 실행
console.log('3');
// 1 3 2 순으로 출력됨
synchronous callback
function printImmediately(sentence){
sentence();
} // 이 부분은 hoisting 됨
printImmediately(() => console.log('hello'));
asynchronous callback
function printWithDelay(print, timeout) {
setTimeout(print, timeout);
} // 이 부분은 hoisting 됨
printWithDelay(() => console.log('async callback'), 2000); // 2초 지연 후 실행
Promise
a JS object for asynchronous operation
state: pending -> fulfilled or rejected
when a new Promise id created, the executor runs automatically.
producer
promise 생성. executor라는 콜백함수를 주는데, 이 안에 resolve(정상), reject(실패시) 이 두개의 콜백함수를 넣음.
new <T> executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;
promise를 만드는 순간 executor가 바로 실행됨. 네트워크 통신코드가 들어있었다면 그걸 바로 수행했을 것.
사용자가 요청했을 때(버튼클릭 등) 통신해야되는 경우라면 불필요한 통신이 발생할 수도 있음.
const promise = new Promise((resolve, reject) => {
console.log('doing sth...'); // doing some heavy work
setTimeout(() => {
resolve('success');
reject(new Error('no network')); // JS에서 제공하는 class인 error로 만든 object
}, 2000);
}); // 만들고 바로 doing sth... 출력됨
consumer
then: 정상수행
catch: 에러잡기
finally: 마지막에 공통수행
promise
.then(value => {
console.log(value); // phin
}) // promise가 정상수행되어서 최종적으로 resolve(콜백함수)를 통해서 전달한 값이 value로 전달
.catch(error => {
console.log(error);
}) // 실패시 catch없으면 uncaught 에러남.
.finally(() => {
console.log('finally');
}); // 성공이든 실패든 상관 없이 실행
promise chaining
then과 catch가 return하는 것도 promise라 catch, finally를 이어서 호출할 수 있음
const fetchNumber = new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000);
});
fetchNumber
.then(num => num * 2)
.then(num => num * 3)
.then(num => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num - 1), 1000);
});
})
.then(num => console.log(num)); // 5 출력
error handling
const getHen = () =>
new Promise((resolve, reject) => {
setTimeout(() => resolve('Hen', 1000));
});
const getEgg = hen =>
new Promise((resolve, reject) => {
// setTimeout(() => resolve(`${hen} => Egg`), 1000); // 에러내기위해 resolve 주석 처리
setTimeout(() => reject(new Error(`error int ${hen} => Egg`)), 1000);
});
const cook = egg =>
new Promise((resolve, reject) => {
setTimeout(() => resolve(`${egg} => Meal`), 1000);
});
getHen()
.then(getEgg) // 받아오는 값을 바로 넣어서 하나를 호출하는 경우 생략 가능. 원래 (hen => getEgg(hen))
.catch(error => { // getEgg에서 문제가 생겨도 전체적인 Promise chain에 문제가 발생하지 않도록 처리
return 'bread';
})
.then(cook)
.then(console.log)
.catch(console.log);
'JS' 카테고리의 다른 글
JS는 왜 이래요? (0) | 2021.03.13 |
---|---|
JS - JSON (0) | 2020.12.25 |
JS - array (0) | 2020.12.24 |
JS - object (0) | 2020.12.23 |
JS - class (0) | 2020.12.22 |