const fs = require('fs');
const fs_promises = require('fs').promises;
fs.readFile('./test.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
})
fs_promises.readFile('./test.txt', 'utf8')
.then((data) => {
console.log(data);
})
.catch((error) => {
console.error(error);
})
const promiseAsync = async () => {
try {
const result = await fs_promises.readFile('./test3.txt', 'utf8');
console.log(result);
} catch(err1) {
console.log(err1);
}
};
promiseAsync();
//아래는 실패한 코드 왜 안되는지 모르겠음
// (async () => {
// try {
// const result = await fs_promises.readFile('./test3.txt', 'utf8');
// console.log(result);
// } catch(err1) {
// console.log(err1);
// }
// })();
fs.readFile의 형식을 보면 fs.readFile('파일위치', 옵션, 콜백함수);
형태이다.
이때는 콜백함수가 하나밖에 없지만 readFile한 결과에 대해 또 콜백함수가 들어간다면 콜백안의 콜백안의 콜백... 이 펼쳐져서 코드가 병렬식이 아닌 깊숙해지는 형태로 가서 가독성면에서 좋지않다.
이를 해결하기 위해 나온게 promise다. 요즘에는 콜백을 인자로 받는 많은 함수들이 promise를 지원한다고 한다.
위의 promise에는 then과 catch로 깊어지지않고 병렬식으로 함수가 만들어진다. 이때 then은 콜백이 성공했을때를 처리하고 catch는 error가 났을때를 처리한다.
이 방법말고 async, await을 이용하는 방법도 있다.
콜백을 인자로 받는 함수에 async를 넣고 비동기 함수 앞에 await을 함수표현식으로 변수에 넣고 변수를 사용하는 형태이다.
const result = await fs_promises.readFile('./test3.txt', 'utf8');
다만 async, await은 promise와는 달리 에러처리가 없기 때문에 try{}catch{}로 감싸서 에러처리를 해줘야 한다.