Promise

NNIIE·2021년 10월 17일
0

javaScript

목록 보기
2/5

Promise

  • 콜백 헬이라고 불리는 지저분한 자바스크립트 코드의 해결책
  • Promise : 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체
  • Then을 붙이면 결과를 반환함
  • 실행이 완료되지 않았으면 완료된 후에
    Then 내부 함수가 실행됨
  • Resolve(성공리턴값) -> then으로 연결
  • Reject(실패리턴값) -> catch로 연결
  • Finally 부분은 무조건 실행됨
const condition = true; // true면 resolve, false면 reject
const promise = new Promise((resolve, reject) => {
  if(condition) {
    resolve('성공');
  } else {
    reject('실패');
  }
});

-----------------------------
  
promise
  .then((message) => {
    console.log(message); // 성공(resolve)한 경우 실행
  })
  .catch((error) => {
    console.log(error); // 실패(reject)한 경우 실행
  })
  .finally(() => { // 끝나고 무조건 실행
    console.log('무조건실행');
  });

프로미스의 then 연달아 사용 가능(프로미스 체이닝)

  • then 안에서 return한 값이 다음 then으로 넘어감
  • return 값이 프로미스면 resolve 후 넘어감
  • 에러가 난 경우 바로 catch로 이동
  • 에러는 catch에서 한 번에 처리
promise
  .then((message) => {
    return new Promise((resolve, reject) => {
      resolve(message);
    });
  })
  .then((message2) => {
    console.log(message2);
    return new Promise((resolve, reject) => {
      reslove(message2);
    });
  })
  .then((message3) => {
    console.log(message3);
  })
  .catch((error) => {
    console.error(error);
  }

콜백패턴(3중첩)을 프로미스로 바꾸는 예제

function findAndSaveUser(Users) {
    Users.findOne({}, (err, user) => {
      if(err) {
          return console.log(err);
      }
      user.name = 'Lee';
      user.save((err) => {
          if(err) {
              return console.log(err);
          }
          Users.findOne({gender: 'm'}, (err, user) => {
                ..........
          });
      });
  });
}

--------------------------------------

function findAndSaveUser(Users) {
    Users.findOne({})
    .then((user) => {
        user.name = 'Lee';
        return user.save();
    })
    .then((user) => {
        return Users.findOne({ gender: 'm'});
    })
    .then((user) => {
        ............
    })
    .catch((err) => {
        console.log(err);
    });
}
  • Promise.resolve(성공리턴값): 바로 resolve하는 프로미스
  • Promise.reject(실패리턴값): 바로 reject하는 프로미스
const promise1 = Promise.resolve('성공1');
const promise2 = promise.resolve('성공2');
Promise.all([promise1, promise2])
.then((result) => {
    console.log(result); // ['성공1', '성공2'];
}).catch((err) => {
    console.log(error);
});
  • Promise.all(배열): 여러 개의 프로미스를 동시에 실행
  • 하나라도 실패하면 catch로 감
  • allSettled로 실패한 것만 추려낼 수 있음

Async/await

  • Async/await으로 한 번 더 축약 가능
async function findAndSaveUser(Users) {
    try {
        let user = await Users.findOne({});
        user.name = 'Lee';
        user = await user.save();
        user = await Users.findOne({gender: 'm'});
    } catch(error) {
        console.log(error);
    }
}

0개의 댓글