학습목표
- 어떤 경우에 중첩된 콜백(callback)이 발생하는지 이해할 수 있다.
- 중첩된 콜백(callback)의 단점, Promise의 장점을 이해할 수 있다.
- async/await 키워드에 대해 이해하고, 작동 원리를 이해할 수 있다.
// <즉시 실행> 동기적으로 실행되고 있는 함수A의 콜백함수 B
function B() {
console.log('콜백!!!');
}
function A(callback) {
callback();
}
A(B) // '콜백!!!'
// 필요에 따라서 callback 함수를 비동기적으로 실행할 수도 있다.
// <상황 별 콜백>
//반복 실행하는 함수 (iterator) : forEach, map, filter 등 iterator 콜백이 반복 실행
[1,2,3].map((el, idx) => {
return el * el;
}); //배열의 길이만큼 반복
//이벤트에 따른 함수 (event handler)
document.querySelector('#btn').addEventListener('click', (e) => {
console.log('button clicked!');
});
< 타이머 관련 API >
setTimeout(function () {
console.log('1초 후 실행');
}, 1000);
const timer = setTimeout(function () {
console.log('10초 후 실행');
}, 10000);
clearTimeout(timer);
// setTimeout이 종료됨.
setInterval(function () {
console.log('1초마다 실행');
}, 1000);
const timer = setInterval(function () {
console.log('1초마다 실행');
}, 1000);
clearInterval(timer);
const printString = (string, callback) => {
setTimeout(function () {
console.log(string);
callback();
}, Math.floor(Math.random() * 100) + 1);
};
const printAll = () => {
printString('A', () => {
printString('B', () => {
printString('C', () => {});
});
});
};
printAll();
// A
// B
// C
let promise = new Promise((resolve, reject) => {
// 1. 정상적으로 처리되는 경우
// resolve의 인자에 값을 전달할 수도 있습니다.
resolve(value);
// 2. 에러가 발생하는 경우
// reject의 인자에 에러메세지를 전달할 수도 있습니다.
reject(error);
});
1. Promise.then(onFulfilled, onRejected)
then()
메서드는 Promise를 리턴하고 두 개의 콜백 함수를 인수로 받는다.let promise = new Promise((resolve, reject) => {
resolve("성공");
});
promise.then(value => {
console.log(value);
// "성공"
})
2.Promise.catch(onRejected)
let promise = new Promise(function(resolve, reject) {
reject(new Error("에러"))
});
promise.catch(error => {
console.log(error);
// Error: 에러
})
3.Promise.finally()
function checkMail() {
return new Promise((resolve, reject) => {
if (Math.random() > 0.5) {
resolve('Mail has arrived');
} else {
reject(new Error('Failed to arrive'));
}
});
}
checkMail()
.then((mail) => {
console.log(mail);
})
.catch((err) => {
console.error(err);
})
.finally(() => {
console.log('Experiment completed');
});
// Error: Failed to arrive
//"Experiment completed"
//또는
//"Mail has arrived"
//"Experiment completed"
const promiseOne = () =>
new Promise((resolve, reject) => setTimeout(() => resolve('1초'), 1000));
const promiseTwo = () =>
new Promise((resolve, reject) => setTimeout(() => resolve('2초'), 2000));
const promiseThree = () =>
new Promise((resolve, reject) => setTimeout(() => resolve('3초'), 3000));
//Promise chaining
const result = [];
promiseOne()
.then(value => {
result.push(value);
return promiseTwo();
})
.then(value => {
result.push(value);
return promiseThree();
})
.then(value => {
result.push(value);
console.log(result);
// ['1초', '2초', '3초'] 총 6s걸림
})
// promise.all
Promise.all([promiseOne(), promiseTwo(), promiseThree()])
.then((value) => console.log(value))
// ['1초', '2초', '3초'] 총 3s걸림
.catch((err) => console.log(err));
// promise.all 에러 발생
Promise.all([
new Promise((resolve, reject) => setTimeout(() => reject(new Error('에러1'))), 1000),
new Promise((resolve, reject) => setTimeout(() => reject(new Error('에러2'))), 2000),
new Promise((resolve, reject) => setTimeout(() => reject(new Error('에러3'))), 3000),
])
.then((value) => console.log(value))
.catch((err) => console.log(err));
// Error: 에러1
// 함수 선언식
async function funcDeclarations() {
await 작성하고자 하는 코드
...
}
// 함수 표현식
const funcExpression = async function () {
await 작성하고자 하는 코드
...
}
// 화살표 함수
const ArrowFunc = async () => {
await 작성하고자 하는 코드
...
}
const printString = (string) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
console.log(string);
}, Math.floor(Math.random() * 100) + 1);
});
};
const printAll = async () => {
await printString('A');
await printString('B');
await printString('C');
};
printAll();
console.log(
`Async/Await을 통해 Promise를 간결한 코드로 작성할 수 있게 되었습니다.`
);
// Async/Await을 통해 Promise를 간결한 코드로 작성할 수 있게 되었습니다.
// A
// B
// C