콜백 헬이라고 불리는 지저분한 자바스크립트 코드의 해결책
프로미스가 왜 필요한지 예시를 들어살펴보자
setTimeout(() => {
//3초후에 실행되는 코드를 뺄 수 없음
}, 3000);
// 프로미스 객체의 값이 있다고 가정
const promise = setTimeoutPromise(3000)
console.log("딴짓")
console.log("딴짓")
console.log("딴짓")
console.log("딴짓")
console.log("딴짓")
console.log("딴짓")
console.log("딴짓")
promise.then(()=>{
console.log("지금실행할래")
}) // 원하는 순간에 값을 반환할 수 있음!
// 콜백 패턴(3중첩)을 프로미스로 바꾸는 예제
function findAndSaveUser(Users){
Users.findOne({}, (err, user)=>{ // 첫번째 콜백
if(err) return err;
user.name = 'zero';
user.save((err) => { // 두번째 콜백
if(err) return err;
Users.finOne({gender : "man"}, (err, user) =>{
생략; // 세번째 콜백
});
});
});
};
// 프로미스로 바꾼 결과 (then의 연속.. 어쩌면 then의 지옥일지도?)
function findAndSaveUser(Users){
Users.findOne({})
.then((user)=>{
user.name='zero';
return user.save();
})
.then((user)=>{
return Users.findOne({gender : "men"})
})
.then((user)=>{
생략
})
.catch((err)=>{
return err;
})
};
그 외 프로미스 사용 방법
// Promise.resolve(성공값리턴) : 바로 resolve하는 프로미스
// Promise.reject(실패값리턴) : 바로 reject하는 프로미스
const promise1 = Promise.resolve("성공");
const promise2 = Promise.reject("실패");
Promise.all([promise1, promise2])
.then((result)=>{
console.log(result) // ["성공","실패"]
})
.catch((error)=>{
console.error(error);
});
// Promise.all(배열) : 여러개의 프로미스를 동시에 실행
// 하나라도 실패하면 catch로 감
// Promise.allSettled 로 실패한 것만 추려낼 수 있음