const state = false;
const promise = new Promise((resolve, reject) =>{
if (state) {
resolve('성공일 때 실행됩니다.');
}else {
reject('실패일 때 실행됩니다.');
}
})
promise
.then((message) => { // resolve
console.log('성공');
})
.catch((err) => { //reject
console.log(err)
})
.finally(() => { //any
console.log('any');
})
- 프로미스 객체를 먼저 생성 한 후 resolve와 reject를 매개변수로 받는 콜백 함수를 넣는다.
- 이렇게 만든 promise에 then, catch, finally가 사용가능하며 then은 resolve, catch는 reject, 성공과 실패여부와 상관없이 finally가 호출된다.
- 실행 순서는 promise 객체가 먼저 실행된 후 then, catch, finally가 실행 된다.
promise
.then((message) => {
return new Promise((resolve, rejcet) => {
resolve((message));
});
})
.then((message2) => {
return new Promise((resolve, rejcet) => {
resolve((message2));
});
})
.catch((error) =>{
console.error(error);
})
- 처음 then 에서 resolve가 되면 다음 then에서 message2로 받을 수 있다.
- *단 new Promise를 return 해야 다음 then에서 이전의 데이터를 넘겨 받을 수 있다.*
다음은 콜백 패턴중 하나이다.
function findAndSaveUser(Users){
Users.findOne({}, (err, user) =>{ //첫번째 콜백
if (err) return console.error(err);
user.name = 'one';
user.save((err) => { //두번째 콜백
if(err) return console.error(err);
Users.findOne({ gender: 'm'}, (err, user) =>{ //세번째 콜백
//중략
});
});
});
}
- Users Db에서 데이터 하나를 뽑아서 이름을 one으로 바꾼 후 저장한 후 gender가 m인 유저를 찾는 함수이다. 이 코드는 콜백 함수가 세 번 중첩되어 있으며 콜백 될때 마다 코드의 길이가 깊어진다.각 콜백 함수마다 에러도 따로 처리해줘야 한다.
다음과 같이 프로미스 형태로 바꿀 수 있다.
function findAndSaveUser(Users){
Users.findOne({})
.then((user) =>{
user.name = 'one';
return user.save();
})
.then((user) =>{
return Users.findOne({ gender: 'm'});
})
.then((user) =>{
//중략
})
.catch(err =>{
console.log(err);
})
}
- 위 코드의 then 메서드 들은 순차적으로 실행 된다. 콜백에서 매번 따로 처리해야 했던 에러도 마지막 catch에서 한번에 처리할 수 있다.
- 하지만 모든 콜백함수를 위와 같이 바꿀 수 있는 것은 아니다. 메서드가 프로미스 방식을 지원해야만 사용 가능하며 지원하지 않는 경우에는 함수를 프로미스로 바꿀 수 있는 방법이 있다.
바로 node에서 제공하는 'util' API에 있는 promisify를 사용하면 된다.
const util = require('util');
const zero = 0;
const createPromise = util.promisify(zero === 1);
createPromise(True)
.then((buf) => {
//중략
})
.catch((err) => {
//중략
})
프로미스를 여러개 한번에 실행 할 수 있는 방법도 있다.
const pro1 = Promise.resolve('res1');
const pro2 = Promise.resolve('res2');
Promise.all([pro1, pro2])
.then((result) => {
console.log('성공');
})
.catch((error) => {
console.error(err);
})
- 같은 방법으로 reject도 가능하며, Promise.all에 넣으면 모두 resolve 될때 까지 기다렸다가 then으로 넘어간다.
- result 매개변수에 각각의 결과값이 배열로 들어 있으며 하나라도 reject 되면 catch로 넘어간다. 쉽게 말하자면 and연산과 비슷하다고 볼 수 있다.
'Language > Javascript' 카테고리의 다른 글
JavaScripts ES2015+(ES6) 정리 (0) | 2023.04.25 |
---|