앞선 아티클에서 우리는 3개의 뎁스를 가진 콜백 함수 예제를 살펴보았습니다.
function findAndSaveUser(Users){
Users.findOne( {}, (err, user) => { // 첫 번째 콜백
if(err){
return console.error(err);
}
user.name = 'zero';
user.save( (err) => { // 두 번째 콜백
if(err){
return console.error(err);
}
Users.findOne( { gender: 'm' }, (err, user) => { // 세 번째 콜백
/* 내용 생략*/
} );
} );
} );
}
위 예제에 대한 설명이 기억나지 않는다면, 아티클을 다시 복습해 보시기 바랍니다.
이제 본격적으로 위 예제를 프로미스를 활용해서 간결하게 다듬어보도록 하겠습니다.
function findAndSaveUser(Users){
Users.findOne({})
.then((user) => {
user.name = 'zero';
return user.save();
})
.then((user) => {
return Users.findOne({gender: 'm'});
})
.then((user) => {
// 내용생략
})
.catch(err => {
console.error(err);
})
}
위 예제가 살짝 헷갈릴 수 있습니다. 프로미스 초반에 학습했던 내용과 비교하면서 다시 차근차근 살펴보겠습니다. 우선, 프로미스 개념을 처음 설명할 때의 아티클을 되짚어보겠습니다.
초반에 아래와 같은 코드가 있습니다. 여기에서 new Promise 객체를 선언하는데, 파라미터에는 resolve와 reject를 파라미터로 받는 함수가 선언되어 있죠. 여기서는 조건 상 true가 전달되므로 then에는 resolve에서 지정해 둔 'SUCCESS parameter'가 파라미터로 전달됩니다.
const condition = true;
// true면 resolve, false면 reject
const promise = new Promise(
(resolve, reject) => {
if(condition){
resolve('SUCCESS parameter');
} else {
reject('FAILED parameter');
}
});
/*
기타 다른 동작들을 선언 가능한 영역
*/
promise
.then(
(message) => {
// 성공(resolve) 실행
console.log(message);
})
.catch(
(error) => {
// 실패(reject) 실행
console.error(error);
})
.finally(
() => {
// 무조건 실행
console.log('UNCONDITIONALLY');
});
/* 출력
SUCCESS parameter
UNCONDITIONALLY
*/
위 예제와 비교해 보면, promise라는 변수를 선언하는 과정이 없습니다. 기본형에서는 new Promise 라인에서 condition의 값에 따라 어떤 파라미터 값이 전달될지 선언하는 과정이 있었는데, 여기에는 그 과정이 없습니다. 즉, findOne과 save 메서드는 내부에 프로미스 객체를 갖고 있고 new Promise가 내부에 구현되어 있는 상태입니다.
function findAndSaveUser(Users){
Users.findOne({})
.then((user) => {
user.name = 'zero';
return user.save();
})
.then((user) => {
return Users.findOne({gender: 'm'});
})
.then((user) => {
// 내용생략
})
.catch(err => {
console.error(err);
})
}
'Programming > Node.js' 카테고리의 다른 글
2. Javascript ES2015 (7) - async/awiat [1/2] (0) | 2024.02.28 |
---|---|
2. Javascript ES2015 (6) - 프로미스 [5/5] (0) | 2024.02.26 |
2. Javascript ES2015 (6) - 프로미스 [3/5] (0) | 2024.02.22 |
2. Javascript ES2015 (6) - 프로미스 [2/5] (0) | 2024.02.21 |
2. Javascript ES2015 (6) - 프로미스 [1/5] (0) | 2024.02.20 |