Node,js의 async동작을 Promise 객체를 이용하여 구현해 보겠습니다.
1. Promise?
Promise 객체는 Javascript의 비동기처리를 위한 객체입니다. 여기서 비동기 처리 코드란, Compiler가 code를 Line by line으로 위에서 아래로 읽어가며 컴파일을 진행할때, blocking fuction 혹은 코드를 만나 해당 코드 밑에 위치한 내용들이 언제 끝날지 모르는 blocking funciton 완료를 기다리는 synchronous operation과 달리, Event Loop을 통해 비동기 처리 코드를 call stack에서 빼와 처리하여 Call stack의 내용들을 보다 신속히 처리할 수 있습니다.
2. Promise 객체 사용
Promise객체는 JAVA의 "new"와 같이, 생성자를 사용하여 새로운 메모리 할당 및 인스턴스 생성을 통해 만들어집니다.
const newPromise = new Promise();
Promise 객체 생성자 내부에는 executor callback 함수가 필요한데, 이 callback 함수는 다시 2개의 callback 함수를 필요로합니다. 이 2개중 하나는 resolve로 정상적인 종료와함께 최종 데이터를 반환하는 callback함수, reject의 경우 함수 동작시 에러가 발생하면 호출하는 callback 함수입니다. 아래 예제는 Promise객체 사용 예제입니다.
const newPromise = new Promise((resolve, reject) => {
readFile("./content/first.txt", "utf-8", (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
};
readFile을 통해 "./content"에 위치한 "First.txt"를 읽어옵니다. 이때, Promise 객체 내부에 readFile 콜백함수를 선언하여, First.txt를 성공적으로 읽었다면 최종 "data"는 resolve를 통해 반환하고, 에러 발생시 reject를 통해 "err"을 반환합니다.
3. 예제 작성
const { readFile } = require("fs");
// Async with Promise
const getText = (path) => {
return new Promise((resolve, reject) => {
readFile(path, "utf-8", (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
};
/* Content folder에 위치한 Frist.txt를 읽어온다. */
getText("./content/First.txt")
.then((result) => console.log(result))
.catch((err) => console.log(err));
- 결과 출력
이번에 알아본 내용은 Node.js에서 비동기처리를위한 Promise 객체 사용방법을 알아봤습니다. Node.js의 내용이라기 보단, Javascript의 코드작성 개념이지만 본격적인 Node.js 작성에 앞서 꼭 필요한 개념이라고 판단되어 포함했습니다.
'웹 개발 > Node.js' 카테고리의 다른 글
[Node.js] #4 HTTP (0) | 2021.12.26 |
---|---|
[Node.js] #2 Event Loop이 무엇인가? (0) | 2021.11.19 |
[Node.js] #1 Event Loop이 무엇인가? (0) | 2021.11.06 |