정재남,『코어자바스크립트』를 읽고 정리한 내용입니다. 이해가 부족한 부분은 책과 동일하게 작성하였습니다.
이전글 콜백함수란?에 이어서 콜백함수를 익명 함수로 전달하는 과정의 반복이 감당하기 힘들 정도로 깊어지는 콜백지옥에 대해 이야기 해보자.
🥴웹의 복잡도가 높아지면서 자바스크립트의 비동기적 코드의 비중도 훨씬 높아졌다. 콜백지옥에도 빠질일이 많아졌겠지~
setTimeout(function (name) {
let coffeeList = name;
console.log(coffeeList); // "에스프레소"
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList); // "에스프레소, 아메리카노"
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList); // "에스프레소, 아메리카노, 카페모카"
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList); // "에스프레소, 아메리카노, 카페모카, 카페라떼"
}, 500, '카페라떼');
}, 500, '카페모카');
}, 500, '아메리카노');
}, 500, '에스프레소');
let coffeeList = '';
const addEspresso = function (name) {
coffeeList = name;
console.log(coffeeList); // "에스프레소"
setTimeout(addAmericano, 500, '아메리카노');
};
const addAmericano = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList); // "에스프레소, 아메리카노"
setTimeout(addMocha, 500, '카페모카');
};
const addMocha = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList); // "에스프레소, 아메리카노, 카페모카"
setTimeout(addLatte, 500, '카페라떼');
};
const addLatte = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList); // "에스프레소, 아메리카노, 카페모카, 카페라떼"
};
setTimeout(addEspresso, 500, '에스프레소');
🤔잠깐! 비동기 처리를 왜 반드시 해야할까?
내가 언제 유저의 data를 받아 올진모르겠지만 내가 약속할게, Promise라는 object를 가지고 있으면 여기에 니가 then이라는 콜백함수만 등록해 놓으면 유저의 data가 준비 되는 대로 니가 등록한 콜백함수 불러줄께! 굿!?? 오키!!
프로미스는 어떤 기능을 실행 후
- 정상적으로 동작하면 → 성공의 메시지와 함께 처리된 결과값을 전달
- 예상치 못한 에러 발생 → Error를 전달
✨ State : pending(보류) → fulfilled(이행) or rejected(거부)
new Promise(function (resolve) {
setTimeout(function () {
const name = '에스프레소';
console.log(name);
resolve(name);
}, 500);
}).then(function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
const name = prevName + ', 아메리카노';
console.log(name);
resolve(name);
}, 500);
});
}).then(function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
const name = prevName + ', 카페모카';
console.log(name);
resolve(name);
}, 500);
});
}).then(function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
const name = prevName + ', 카페라떼';
console.log(name);
resolve(name);
}, 500);
});
})
const addCoffee = function (name) {
return function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
const newName = prevName ? (prevName + ', ' + name) : name;
console.log(newName);
resolve(newName);
}, 500);
});
}
};
addCoffee('에스프레소')()
.then(addCoffee('아메리카노'))
.then(addCoffee('카페모카'))
.then(addCoffee('카페라떼'))
ES6에 추가된 '*'이 붙은 함수
const addCoffee = function (prevName, name) {
setTimeout(function () {
coffeeMaker.next(prevName ? prevName + ', ' + name : name);
}, 500);
};
const coffeeGenerator = function* () {
const espresso = yield addCoffee('', '에스프레소');
console.log(espresso);
const americano = yield addCoffee(espresso, '아메리카노');
console.log(americano);
const mocha = yield addCoffee(americano, '카페모카');
console.log(mocha);
const latte = yield addCoffee(mocha, '카페라떼');
console.log(latte);
};
const coffeeMaker = coffeeGenerator();
coffeeMaker.next();
💡프로미스 연결도 계속하면 코드 가독성 떨어져~~
const addCoffee = function (name) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(name);
}, 500);
});
};
const coffeeMaker = async function () {
let coffeeList = '';
const _addCoffee = async function (name) {
coffeeList += (coffeeList ? ',' : '') + await addCoffee(name);
};
await _addCoffee('에스프레소');
console.log(coffeeList);
await _addCoffee('아메리카노');
console.log(coffeeList);
await _addCoffee('카페모카');
console.log(coffeeList);
await _addCoffee('카페라떼');
console.log(coffeeList);
};
coffeeMaker();
[참고한자료]
정재남, 『코어자바스크립트』, 위키북스(2019)
https://hsolemio-lee.github.io/core-javascript1/
https://youtu.be/aoQSOZfz3vQ