[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
섹션 1. 알아두어야 할 자바스크립트
✏️ 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
는 결과가 status
와 value
로 이루어진 객체의 배열이 나왔다. status
에 성공 시 fulfilled
가, 실패 시 rejected
가 들어간다.
[에이싱크/어웨잇]으로 발음해야 한다
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 교과서 - 기본부터 프로젝트 실습까지 (인프런/조현영)