동기는 순차적으로 테스크를 수행하고, 비동기는 병렬적으로 수행한다.
const f1 = () => {
console.log('hello');
f2();
};
const f2 = () => {
console.log('world');
f3();
};
const f3 = () => {
console.log('!!');
};
f1(); //f1 -> f2 -> f3
const f1 = () => {
console.log('hello');
f2();
};
const f2 = () => {
setTimeout(() => {
console.log('world');
});
f3();
};
const f3 = () => {
console.log('!!');
};
f1(); //f1 -> f3 -> f2
위의 콜백 헬을 극복하기 위해 ES6에서 Promise가 도입되었다
const promise = new Promise((resolve, reject) => {
// 콜백 함수 내부에서 비동기 처리를 수행한다.
if (// 비동기 처리 성공) {
resolve('success');
} else { // 비동기 처리 실패
reject('fail');
}
}
promise
.then(value => {
console.log(value); //success 출력
})
.catch(error => {
console.log(error);
})
Promise란 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체를 의미한다.
즉 위의 promise변수에 Promise객체가 저장되고, 이는 나중에 결과 값을 가져와 사용할 수 있다는 것을 의미한다.
그리고 Promise를 생성할 때, 콜백 함수를 인자로 넘겨 주는데, 그 콜백안에 두 개의 콜백함수를 또 넘겨준다. (resolve, reject)
이 두 콜백은 각각 비동기 처리의 성공, 실패 여부에 따라 수행된다.
만약 성공했다면 resolve 함수를 통해 success라는 메시지가 전달된다.
이렇게 생성한 프로미스를 사용하기 위해서 then이라는 기능을 사용한다.
then에서 value는 resolve에서 전달한 메시지가 전달된다.
만약 resolve가 아니라 reject (실패)라면 then 이 아닌 catch를 이용하여 진행한다.
const fetchNumber = new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000); // (*)
});
fetchNumber
.then(num => num * 2) // (**)
.then(num => num * 2) // (***)
.then(num => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num), 1000);
});
})
.then(num => console.log(num)); // 4
(*)
.then
핸들러가 호출됩니다. –(**)
.then
핸들러에 전달됩니다. – (***)