4callback, promise등을 사용하는 이유?
자세하게 설명하면 너무 복잡하고 어렵다.
본 포스트에서는 Promise를 사용하는 방법을 알려주는 예제입니다.
Promise를 사용해야 하는 이유와 좀 더 심도 깊게 알고 싶은 분들은 구글링을 통하여 한 번 검색해 보시는 걸 추천드립니다.
본 포스트를 보시기에 앞서 동기화와, 비동기화에 대해서는 반드시 사전에 숙지가 되어 있어야합니다.
동기화 비동기화에 대해서 숙지하시지 못하신 분은 아래의 포스트를 먼저 보고 와주시기 바랍니다.
developing-move.tistory.com/20
먼저 callback 지옥이란?
콜백 안에 콜백이 생성되는 것이 반복되다 보니 소스의 가독성이 떨어지는 것을 말함.
callback 지옥 예시 소스
exports.get_products_detail = ( req , res ) => {
// req.param.id
// Products.js의 Products와 맵핑
const product1 = models.Products.findByPk(req.params.id).then( (product) => {
const product2 = models.Products.findByPk(req.params.id).then( (product) => {
const product3 = models.Products.findByPk(req.params.id).then( (product) => {
if("조건"){
const product2 = models.Products.findByPk(req.params.id).then( (product) => {
});
} else {
const product5 = models.Products.findByPk(req.params.id).then( (product) => {
});
}
});
});
});
res.render('admin/detail.html', { product1: product1, product2: product2, product3: product3
, product4: product4, product5: product5 });
};
위 예시와 같이 조건이 많아 질수록 가독성이 현저히 떨어지게 됨
promise 연습을 위해 vs코드 혹은 자신이 사용할 에디터에 연습용 폴더와 파일을 생성
promise를 만들기 위해선 두 가지가 필요함
- resolve와 reject를 인자로 가지는 함수를 만든다.
- 내가 원하는 시점을 resolve로 받아온다.
먼저 resolve와 reject를 인자로 가진 함수를 만듦
const aa = new Promise(( resolve, reject) => {
resolve(console.log("promise 이행"));
});
aa.then(( ) => {
console.log("promise 실행 완료");
});
동일한 방식으로 변수도 전달 가능함
// resolve와 reject를 인자로 가진 함수를 만든다.
const aa = new Promise(( resolve, reject) => {
console.log("promise 이행")
resolve("promise 종료");
});
aa.then((result) => {
console.log(result);
});
Sequelize에서 DB를 조회했을 때도 promise를 이용했었다.
developing-move.tistory.com/98
아래 소스도 동일하게 DB를 다녀오는 동안 다음 로직을 실행하지 않고 기다렸다가
완료되면 then()의 로직을 실행하는 것이다.
exports.get_products_detail = ( req , res ) => {
// DB를 다녀 온 후에 then 안에 로직을 실행함
models.Products.findByPk(req.params.id).then( (product) => {
res.render('admin/detail.html', { product: product });
});
};
좀 더 알아보기 쉽게 하기 위하여 setTimeout function을 활용하여 연습
// resolve와 reject를 인자로 가진 함수를 만든다.
const wait1seconds = new Promise(( resolve, reject) => {
// 1(순서)
console.log("promise 시작");
setTimeout( () => {
// 내가 원하는 시점을 resolve로 받아온다.
// 2(순서)
resolve( console.log("-- 1초 지남 --"));
}, 1000)
});
wait1seconds.then(() => {
// 3(순서)
console.log("promise 이행 완료");
});
위의 소스를 실행하게 되면 주석 처리 되어 있는 순서대로 실행이 된다.
reject는 에러 처리를 할 때 사용한다.
catch 사용
'Javascript > Node' 카테고리의 다른 글
[Node] EventEmitter (0) | 2020.09.28 |
---|---|
[Node] Promist Chainging, Promist.all (0) | 2020.09.28 |
[Node] npx란? (0) | 2020.09.23 |
[Node] node Semantic Versioning (0) | 2020.09.23 |
[node] Sequelize에서의 DB 삭제 (0) | 2020.09.08 |