비동기 - 이벤트 기반 동작을 코드로 구현하는 방법
node.js에서 비동기 동작을 구현하는 세가지 방법을 학습
callback
전통적 javaScript의 이벤트 기반 코딩 방식
const countDown = require('./countdown');
countDown(5, ()=>{
console.log("BOOM!");
});
function countDown(count, callback) {
console.log(count);
if (count === 0) {
callback();
return;
}
setTimeout(() => {
countDown(count - 1, callback);
}, 1000);
}
module.exports = countDown;
Promise
callback의 단점을 보완한 비동기 코딩방식
콜백함수의 지옥
function adder(a, b, callback) {
if (a == 0 || b == 0) {
callback("no zero", null);
return;
}
console.log(`${a}+${b}=${a + b}`);
callback(null, a + b);
}
function handle_error(error) {
console.log("ERROR: ", error);
}
function add_all(a, b, c) {
adder(a, b, (err, result) => {
if (err != null) {
adder(result, c, (err, result2) => {
if (err != null) {
console.log("${a}+${b}+${c}=${result2}");
} else {
handle_error(err);
}
});
} else {
handle_error(err);
}
});
}
function adder(a, b, callback) {
if (a == 0 || b == 0) {
callback("no zero", null);
return;
}
console.log(`${a}+${b}=${a + b}`);
callback(null, a + b);
}
function handle_error(error) {
console.log("ERROR: ", error);
}
function adder_promise(a, b) {
return new Promise((resolve, reject) => {
adder(a, b, (err, result) => {
if (err) {
reject(err);
return;
}
resolve(result);
});
});
}
function add_all(a, b, c) {
adder_promise(a, b)
.then((result)=>{
return adder_promise(result,c);
})
.then(result2 => {
console.log(`${a}+${b}+${c}=${result2}`);
})
.catch((err)=>handle_error(err));
/* 4. catch 를 활용하여 promise 의 에러를 handle_error 함수로 전달하기 */
}
module.exports = add_all;
실행 시 함수를 세 번 시행하고
각각 add_all(1, 2, 3), add_all(4, 5, 0), add_all(6, 0, 7)이 실행된다.
출력값
1+2=3
3+3=6
1+2+3=6
-
4+5=9
ERROR: no zero
-
ERROR: no zero
Async-Await
promise의 단점을 보완한 비동기 코딩 방식
function adder_promise(a, b) {
return new Promise((resolve, reject) => {
resolve(a+b);
});
}
module.exports = adder_promise;
const adder_promise = require('./promise');
function main_promise(a, b, c, d) {
Promise.all([
adder_promise(a, b),
adder_promise(c, d),
])
.then(([r1, r2]) => {
return adder_promise(r1, r2);
})
.then((r3) => {
console.log(`${a}+${b}+${c}+${d}=${r3}`);
});
}
/* 1. main 을 async 함수로 선언 */
async function main(a, b, c, d) {
const [r1, r2] = await Promise.all([
adder_promise(a,b),
adder_promise(c,d),
])/* 2. 두 promise 함수를 동시에 실행하여 결과를 r1, r2에 저장 */
const r3 = await adder_promise(r1,r2);
console.log(`${a}+${b}+${c}+${d}=${r3}`);
}
main(1,2,3,4);
JavaScript에서는 대부분 가독성이 좋은 async-await을 지향하지만,
특정상황에 맞는 비동기 코딩 방식을 구사할줄 알아야 할 것으로 보인다.
'PROGRAMING > NODE.JS' 카테고리의 다른 글
[Node.js] Multer-S3를 이용한 이미지 업로드 (0) | 2022.02.24 |
---|