Promise, async/await

기초/JavaScript|2021. 9. 8. 20:55

Promise?

Promise : 내용이 실행은 되었지만 아직 결과를 아직 반환하지 않은 객체

→ 실행된 결과를 가지고 있다가 Then을 붙이면 결과를 반환한다.

실행이 완료되지 않은 경우에는 완료된 이후에 Then 내부 함수가 실행된다.

 

프로미스는 어떤 동작을 하는 것. (어떤 파일을 읽어라, 어디에 어떤 요청을 보내고 와라)

언제나 실패할 가능성을 염두에 두어야 함.

성공하면 resolve를 호출, 실패하면 reject를 호출한다.

const condition = true; //true면 resolve, false면 reject
const promise = new Promise((resolve, reject) => {
  if (condition){
    resolve("성공");
  } else {
    reject("실패");
  }
});
//다른 실행할 코드가 들어갈 수 있다.
promise
  .then((message) => {
    console.log(message);
  })
  .catch((error) => {
    console.error(error);
  });

성공하면 "성공"을 message에 담아주고, 실패하면 "실패"를 error에 담아 준다.

 

Resolve(성공리턴값) →  then으로 연결

Reject(실패리턴값) → catch로 연결

 

 

Async/await?

async function 의 await으로 promise의 then을 대체할 수 있다.

async function도 결국 promise의 문법을 간단하게 만든 것이기 때문에...

에이싱크 함수에서 리턴한 것은 무조건 then으로 받아야 한다.

function findAndSaveUser(Users) {
  Users.findOne({}) //실행순서는 위->아래
  .then((user) => {
    user.name = "doodoo";
    return user.save();
  })
  .then((user) => {
    return Users.findOne({ gender : "f" });
  });
  //이하 생략
}

async function findAndSaveUser(User) {
  let user = await Users.findOne({}); //실행순서 왼쪽 <- 오른쪽
  user.name = "doodoo";
  user = await user.save();
  user = await Users.findOne({ gender : "f" });
  //이하 생략
}

위쪽 코드와 아래쪽 코드는 같은 기능을 함.

 

단, async await은 프로미스와 똑같지만 resolve만 가능하고 reject를 처리하는 부분이 없다.

reject를 처리하기 위해서는 try-catch문을 써 줘야 한다.↓

async function main() {
  const result = await Promise;
  return result;
}
main().then((name) => {}); //이걸 쓰거나
const name = await main(); //이걸 써야함

//

async function main() {
  try {
    const result = await Promise;
    return result;
  } catch (error) {
    console.log(error);
  }
}

main().then((name) => {}); //이걸 쓰거나
const name = await main(); //이걸 써야함

화살표 함수도 async/await 가능하다.

async함수는 항상 프로미스를 반환한다.

for await ~ of : 프로미스들의 배열을 반복문으로 돌릴 수 있다.

 

참조 : 제로초(zerocho)님 인프런 강의

'기초 > JavaScript' 카테고리의 다른 글

구조분해 할당  (0) 2021.09.06
화살표 함수와 function  (0) 2021.09.06
var, const, let  (0) 2021.09.06

댓글()