Users.findOne('zero', (err, user) => {
if (err) {
return console.error(err);
}
console.log(user);
Users.update('zero', 'nero', (err, updatedUser) => {
if (err) {
return console.error(err);
}
console.log(updatedUser);
Users.remove('nero', (error, removedUser) => {
if (err) {
return console.error(err);
}
console.log(removedUser);
});
});
});
console.log('다 찾았니?');
콜백을 사용하다 보면 깊이가 계속해서 깊어지는 콜백지옥을 경험할 수 있다.
Users.findOne('zero')
.then((user) => {
console.log(user);
return Users.update('zero', 'nero');
})
.then((updatedUser) => {
console.log(updatedUser);
return Users.remove('nero');
})
.then((removedUsers) => {
console.log(removedUser);
})
.catch((err) => {
console.error(error);
});
console.log('다 찾았니?');
ES6에서는 이를 해결 하기 위해서 promise를 만들었다. 깊이가 깊어지지 않는다.
또 에러를 콜백의 단계마다 따로 작성하던 에러 조건문을 .catch()에서 단한번에 처리 할 수도 있다.
그런데 이 문법의 이름이 왜 promise이고 .then이 있으며 어째서 return문이 있는지 생소하게 다가올 수 있다.
브라우저의 콘솔에 promise를 타이핑하면 대문자로 시작하는 함수, 즉 생성자임을 알 수 있다.
new Promise((resolve, reject) => {
});
Promise생성자의 형태는 resolve와 reject를 매개변수로하는 함수를 매개변수로 갖는다.
여기서 resolve는 성공메세지, reject는 실패메세지와 연관되어 있다.
내부에는 원하는 로직으로 코딩을 할 수 있고, 변수에 담아 사용할 수 있다.
콜백함수는 호출하는 곳에 그 후의 행동을 바로 작성하도록 되어 있지만
Promise는 로직을 작성하는 것과 .then으로 시작하는 호출을 분리시켜 작성한다.
따라서 호출 후의 행동은 개발자가 원하는 코딩 맥락에서 꺼내어 사용하면된다.
즉 결과는 이미 로직을 작성하는 시점에 나있지만 호출 후의 행동을
개발자가 원할때 율통성 있게 제어할 수 있는 장점을 가진다.
const plus = new Promise((resolve, reject) => {
const a = 1;
const b = 2;
if (a + b > 2) {
resolve(a + b);
} else {
reject(a + b);
}
});
plus
.then((success) => {
console.log(success);
})
.catch((fail) => {
console.error(fail);
})
아까 본 Users.findOne 메서드에서 promise형태의 문법을 사용할 수 있었던 이유도 사실
const Users = {
findOne() {
return new Promise((res, rej) => {
if ('사용자를 찾았으면') {
res('사용자');
} else {
rej('못 찾았어요');
}
})
}
}
Users.findOne()
내부적으로 Promise를 리턴하도록 메서드를 작성하여 Users로 받았기 때문이다.
따라서 사용시 .then과 .catch를 사용할 수 있게 된 것이다.
Promise를 리턴하지 않는 콜백 메서드라면 promise문법을 사용할 수 없다.
const condition = true;
const promise = new Promise((resolve, reject) => {
if (condition) {
resolve('성공');
} else {
reject('실패');
}
});
promise
.then((message) => {
return new Promise((resolve, reject) => {
resolve(message);
});
})
.then((message2) => {
console.log(message2);
return new Promise((resolve, reject) => {
reject(message2);
});
})
.then((message3) => {
console.log(message3);
})
.catch((error) => {
console.error(error);
});
then을 연달아 쓰는 형태라면 이렇게 실행한 것이다.
then에 리턴값이 있으면, 다음 then으로 넘어가도록 되어있다.
Promise를 리턴하면 resolve나 reject되어 넘어간다.
Promise.all([Users.findOne(), Users.remove(), Users.update()])
.then((results) => {})
.catch((error) => {})
Promise.all()을 이용하면 작성해둔 promise들을 여러개 한꺼번에 실행 하여 결과를 얻어올 수도 있다.
promise들 중에 하나라도 reject에 해당한다면 결과를 얻어 올 수 없다는 점은 주의해야한다.
const condition = true;
const promise = new Promise((resolve, reject) => {
if (condition) {
resolve('성공');
} else {
reject('실패');
}
});
const promise = new Promise((res, rej) = {
res('성공');
});
const promise = new Promise((res, rej) = {
rej('실패');
});
const successPromise = Promise.resolve('성공');
const failurePromise = Promise.reject('실패');
조건에 따라 성공과 실패가 나뉘는 promise가 아닌
무조건 성공하는 promise나 무조선 실패하는 promise는
간략하게 작성할 수 있다.
출처, 참조: https://www.zerocho.com
'Node.js' 카테고리의 다른 글
crypto모듈을 이용한 암호화 (0) | 2019.09.30 |
---|---|
ES8(2017)에서의 변화 (0) | 2019.09.30 |
ES6(2015)에서의 변화 2 (0) | 2019.09.29 |
ES6(2015)에서의 변화 1 (0) | 2019.09.29 |
Ant Design (0) | 2019.09.28 |
댓글