은도미
은도미 개발일지
은도미
전체 방문자
오늘
어제
  • 분류 전체보기 (46)
    • DAILY (0)
    • BOOKS (0)
    • STUDY (17)
      • 면접준비 (3)
      • 모던 자바스크립트 Deep Dive (10)
      • Git (1)
    • PROGRAMING (14)
      • HTML (0)
      • CSS (0)
      • JS (0)
      • TYPESCRIPT (7)
      • NODE.JS (2)
      • Express.js (1)
      • React (3)
      • Nextjs (1)
    • ALGORITHM (5)
      • JS (1)
      • PYTHON (3)
      • 백준 (0)
      • 프로그래머스 (0)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅂ

최근 댓글

최근 글

티스토리

은도미

은도미 개발일지

PROGRAMING/NODE.JS

Node.js 비동기 코딩

2021. 12. 1. 16:20

비동기 - 이벤트 기반 동작을 코드로 구현하는 방법

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
    'PROGRAMING/NODE.JS' 카테고리의 다른 글
    • [Node.js] Multer-S3를 이용한 이미지 업로드
    은도미
    은도미
    아름다움은 매일 있어.
    hELLO. 티스토리 스킨을 소개합니다.
    제일 위로

    티스토리툴바