Study/Express(node.js)
node.js ) 비동기 패턴 해결 (1) - 콜백함수
JongIk
2022. 2. 5. 16:42
반응형
콜백함수를 이용한 비동기 패턴 해결
가장 기본적인 방법으로 콜백함수를 이용해 비동기 패턴을 해결할 수 있습니다.
- 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
반응형