본문 바로가기
Study/Express(node.js)

node.js ) 비동기 패턴 해결 (1) - 콜백함수

by JongIk 2022. 2. 5.
반응형

콜백함수를 이용한 비동기 패턴 해결

가장 기본적인 방법으로 콜백함수를 이용해 비동기 패턴을 해결할 수 있습니다.

  • test.txt
async test 1
async test 2
  • index.js
const fs = require('fs');

fs.readFile('./test.txt', (err, data) => {
    console.log(1)
    console.log(data.toString());
    fs.readFile("./test.txt", (err, data) => {
      console.log(2);
        console.log(data.toString());
        fs.readFile("./test.txt", (err, data) => {
          console.log(3);
            console.log(data.toString());
            console.log('test');
        });
    });
});

console.log('test');
  • 실행 결과

  • 첫번째 fs.readFile 을 실행하면 메인 스레드는 해당 코드를 다른 스레드에게 넘깁니다.
  • 여기서 해당 코드를 전달받은 스레드를 워커 스레드라고 합니다.
  • 워커 스레드는 첫 번째 fs.readFile 을 실행하고 실행이 끝나면 결과를 반환해 콜백함수를 메인 스레드에게 전달합니다.
  • 메인 스레드는 콜백함수를 실행하는데 다시 fs.readFile 을 만나고 해당 스레드를 워커 스레드에게 전달합니다.
    이 흐름을 반복하게 됩니다.

함수 형태로 분리하기

위의 방법은 코드가 길어지면 상당히 추상적이지 못하게 됩니다.
또한 코드가 점점 안쪽으로 들어가 화살표 형태가 됩니다. (콜백지옥)

각 fs.readFile 을 함수로 분리해 사용하면 조금 더 간결하게 표현할 수 있습니다.

const fs = require('fs');

const thirdFs = () => {
    fs.readFile('./test.txt', (err, data) => {
        console.log(3);
        console.log(data.toString());
        console.log('test');
    })
}

const secondFs = () => {
  fs.readFile("./test.txt", (err, data) => {
    console.log(2);
      console.log(data.toString());
      thirdFs();  // thirdFs 호출
  });
};

const firstFs = () => {
  fs.readFile("./test.txt", (err, data) => {
    console.log(1);
      console.log(data.toString());
      secondFs(); // secondFs 호출
  });
};

firstFs();   // firstFs 호출

console.log('test');

  • 이전의 코드보다 보기는 좋지만 코드를 작성하는 것에 있어 더 까다로워졌습니다.

이러한 문제점을 해결하기 위해 Promise 패턴을 사용할 수 있습니다.

다음 글에서 살펴보겠습니다!

 

node.js ) 비동기 패턴 해결 (2) - Promise

비동기 패턴 해결 - Promise 이전 글에서 콜백형태로 비동기 처리하는 방법을 다뤘습니다. 하지만 콜백 형태를 이용해 비동기를 처리하면, 처리는 가능하지만 매우 비효율적으로 코드가 작성됩니

jongik.tistory.com

 

반응형

댓글