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

 - 프로미스 : 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체

 - 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.error(error);
  });

 

결과값

D:\code\node\lecture2>node test1.js
성공

 

promise.all(배열) : 여러 개의 프로미스를 동시에 실행

 - 하나라도 실패하면 catch로 감

 - allSettled로 실패한 것만 추려낼 수 있음

const promise1 = Promise.resolve("성공1");
const promise2 = Promise.resolve("성공2");
Promise.all([promise1, promise2])
  .then((result) => {
    console.log(result); // ['성공1','성공2'];
  })
  .catch((error) => {
    console.error(error);
  });

 

결과값

D:\code\node\lecture2>node test1.js
[ '성공1', '성공2' ]

 

Async/awit 으로 한 번 더 축약 가능

function findAndSaveUser(Users) {
  Users.findOne({})
    .then((user) => {
      user.name = "gildong";
      return user.save();
    })
    .then((user) => {
      return Users.findOne({ gender: "m" });
    })
    .then((user) => {
      //생략
    });
}

 

Async function 의 도입

 - 변수 = await 프로미스; 인 경우 프로미스가 resolve 된 값이 변수에 저장

 - 변수 await 값; 인 경우 그 값이 변수에 저장

async function findAndSaveUser(Users){
  let user = await Users.findOne({});
  user.name = 'gildong';
  user = await user.save();
  user = await Users.findOne({gender : 'm'});
  //생략
}

 

for await ( 변수 of 프로미스배열)

 - resolve된 프로미스가 변수에 담겨 나옴

 - await을 사용하기 때문에 async 함수 안에서 해야함

const promise1 = Promise.resolve("성공1");
const promise2 = Promise.resolve("성공2");
(async () => {
  for await (promise of [promise1, promise2]) {
    console.log(promise);
  }
})();

 

결과값

D:\code\node\lecture2>node test1.js
성공1
성공2

 

 

+ Recent posts