[Node.js] Promise, async/await

말하는 감자·2024년 3월 3일
0
post-thumbnail

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

섹션 1. 알아두어야 할 자바스크립트

📌 Promise, async/await

📍 Promise

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

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);	// 실패(reject)한 경우 실행
	})
	.finally(() => {			// 끝나고 무조건 실행
  		console.log('무조건');
	});

Promise가 결과를 가지고 있다가 then이나 catch를 이용해 결과를 반환한다.

콜백 함수 대신 Promise 사용하면 먼저 실행 해놓고 필요할 때 결과를 꺼내 사용가능하기 때문에 코드가 더 깔끔해진다. node.js 생태계에서 콜백 대신 Promise 전환되고 있어서 Promise 꼭 익혀두는 것이 좋다.

✏️ Promise.all(배열) : 여러 개의 프로미스를 동시에 실행한다
하나라도 실해파면 catch로 간다.
✏️ Promise.allSettled(배열): 실패한 것만 추려낼 수 있다
요즘은 Promise.all보단 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);
	});
          
Promise.allSettled([promise1, promise2])
	.then((result) => {
 		console.log(result);
  		// [{ status: "fulfilled", value: "성공1" }, { status: "fulfilled", value: "성공2" }]
	})
    .catch((error) => {
		console.error(error);
	});

🥔💬 실제로 실행해보니 Promise.all은 결과가 resolve 값으로 이루어진 배열로 나오지만 Promise.allSettled는 결과가 statusvalue로 이루어진 객체의 배열이 나왔다. status에 성공 시 fulfilled가, 실패 시 rejected가 들어간다.

📍 async/await

[에이싱크/어웨잇]으로 발음해야 한다
Promise에서 then이 연속적으로 나오는 코드를 async/await로 간략화 할 수 있다.

⬇️

then에서 받았던 결과값들을 앞에서 받는다.
실행순서가 오른쪽에서 왼쪽으로 진행된다.

let user = await Useres.findOne({});

// Useres.findOne({}) ➡️ Promise
// await ➡️ then
// usert ➡️ 결과값

await을 쓸 때는 함수에 항상 async가 붙어야 한다.
근데 요즘에는 자바스크립트에 Top-level await이 나와서 아래처럼 함수 없이 사용 가능하다.

const promise = new Promise(...);

const result = await promise;

async는 결국 Promise를 간단하게 만든 것이기 때문에 Promise의 성질을 그대로 가진다.

const promise = new Promise(...);
                            
async function main() {
  const result = await promise;
  return result;
}

main().then((name) => ...);
// or
const result = await main();

async/await이 Promise랑 똑같은데 resolve만 처리할 수 있고 reject를 처리하는 부분이 없어서 try/catch문으로 감싸서 처리를 해줘야한다.

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

async 함수는 항상 Promise를 반환한다.

✏️ for await (변수 of 프로미스배열) : 프로미스들을 반복할 때 사용

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

📑 출처

  • [개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지 (인프런/조현영)
profile
나는 말하는 감자다

0개의 댓글