[Node.js] promise/async-await

Cjw.dev·2023년 3월 6일

Node.js

목록 보기
9/10

콜백 헬이라고 불리는 지저분한 자바스크립트 코드의 해결책

  • 프로미스 : 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체
  • Then을 붙히면 결과를 반환함
  • 실행이 완료되지 않았으면 완료된 후에 Then 내부 함수가 실행됨
  • Resolve(성공값리턴) -> Then으로 연결
  • Reject(실패값리턴) -> catch로 연결
  • Finally 부분은 무조건 실행됨
  • promise의 필요 : 코드를 분리할 수 있냐 없냐의 차이!!

프로미스가 왜 필요한지 예시를 들어살펴보자

  1. 원하는 때에 값을 반환
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("지금실행할래")
}) // 원하는 순간에 값을 반환할 수 있음!
  1. 콜백 지옥 탈출
// 콜백 패턴(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 로 실패한 것만 추려낼 수 있음
profile
백엔드 개발 공부 기록 22.11.07 ~ ing

0개의 댓글