javascript의 콜백함수 개념에 대해 학습한 시간.
아직은 헷갈리는 부분도 있지만.. 열심히 공부해보자! 🔥
[드림코딩 강의를 참고하여 작성했습니다!]
1) 동기 콜백과 비동기 콜백
function printImmidiately(print) {
print();
}
printImmidiately(()=> console.log('hello')); ```
function printWithDelay(print, timeout) {
setTimeout(print,timeout);
}
printWithDelay(()=>console.log('async callback'),2000);
1) Producer
const promise = new Promise ((resolve, reject) => {
console.log('doing something...');
setTimeout(()=> {
resolve('dodam');
reject (new Error('no network'));
// 둘 중 하나만 활성화해서 확인해보기!
},2000);
});
2) Consumer - then,catch,finally
ex) 기본 형태
Promise
.then((value)=> {
console.log(value);
})
.catch(error =>{
console.log(error);
})
.finally(()=> {
console.log('finally');
});
3) promise chaning
promise를 연결한 형태. 직접 구현해보며 개념을 확립해보자.
ex)
const fetchNumber = new promise ((resolve, reject =>{
setTimeout (()=> resolve(1),1000);
}));
fetchNumber
.then (num => num * 2) //2
.then (num => num * 3) //6
.then (num => { //6
return new promise ((resolve, reject) => {
setTimeout (()=> resolve(num -1),1000); //5
});
})
.then (num => console.log(num)); //5 출력됨 ```
4) Error handling
ex) 3가지의 promise return.
각 1초씩 모두 출력되려면 3초가 걸리게 지정
const getHen = () =>
new promise ((resolve, reject) => {
setTimeout(() => resolve ('닭'),1000);
});
const getEgg = hen =>
new promise ((resolve,reject) =>{
setTimeout(()=> resolve(`${hen} => egg`),1000);
setTimeout(()=> reject (new Error (`error! ${hen} => 계란 `)), 1000);
});
const cook = egg =>
new promise((resovle, reject) => {
setTimeout(() => resolve (`${egg}=> fried`),1000);
});
/ .then 값 지정. 생략가능한 것들 생략해 코드를 정리하고-
getHen()
.then(hen=> getEgg(hen))
.then(egg => cook(egg))
.then(meal => console.log(meal));
/ 계란을 송출하지 못한다면?.
상단 에러를 처리하기 위해 catch를 넣어줌
getHen() //
.then(getEgg)
.catch(error => {
return '빵';
})
async function 함수명 (){
await 비동기처리메서드명 ();
} ```
1) async
ex) 네트워크 요청이 10초 걸리는 서버가 있다고 가정하고,
promise와 async로 코드를 쓴다면?
function fetchUser() {
return 'dodam';
}
1) Promise 로 쓰면?
function fetchUser() {
return new Promise ((resolve, reject)=> { // do network request in 10secs...
resolve ('dodam');
});
}
// resolve나 reject를 쓰지 않으면 계속 pending 상태로 남아있음
2) async 사용하면?
async function fetchUser() {
// do network request in 10secs...
return ('dodam');
};
const user = fetchUser();
user.then(console.log);
console.log(user);
- fatchUser는 promise를 return한다.
2) awiat
ex)
function delay(ms) {
return new Promise (resolve => setTimeout(resolve,ms));
}
async function getApple() {
await delay (3000); // 딜레이가 끝날 때까지 기다려줌
throw 'error';
return 'apple';
}
async function getBanana() {
await delay (3000);
return 'banana';
}
1) promise를 쓴다면?
function getBanana() {
return delay(3000)
.then(()=> 'banana');
}
function pickFruits() {
return getApple().then (apple => {
return getBanana().then(banana => `${apple}+ ${banana}`);
});
}
pickFruits().then(console.log);
2) async로 표현하면?
async function pickFruits () {
try {
const apple = await getApple();
const banana = await getBanana();
} catch {
return `${apple}+ ${banana}`;
}
pickFruits().then(console.log);
* 병렬로 표현하기 (기다릴 필요가 없기 때문에)
async function pickFruits () {
const applePromise = getApple();
const bananaPromise = getBanana();
const apple = await applePromise;
const banana = await bananaPromise;
return `${apple}+ ${banana}`;
}
pickFruits().then(console.log);
3) 유용한 promise APIS
function pickAllFruits() {
return Promise.all([getApple(), getBanana()])
.then(fruits => fruits.join('+')
);
}
function pickOnlyOne() {
return Promise.race([getApple(),getBanana()]);
}
pickOnlyOne().then(console.log);
짚고 넘어갈 개념