200427 TIL(2)
fs.readfile
nodeJS의 모듈 중 하나인 fs를 통해 파일을 읽어오도록 할 수 있다. 이중에서 fs의 메소드 중 readFile함수는 비동기적으로 기능한다.(동기적인 기능은 readfileSync로, 이름이 긴 것만 봐도 nodeJs의 주류가 아닌 것을 볼 수 있다. nodeJs의 주류는 비동기적 실행이 되는 readfile이다.)
readFile 함수를 보면 다음과 같은 세 개의 인자가 필요하다.
path : 내용을 읽을 파일의 경로
option : 파일의 내용을 읽을 때 적용할 옵션 (생략가능) - utf8로 대부분 정리 가능
callback : 파일의 내용을 다 읽었을 때 실행할 콜백 함수
callback의 인자는 앞서 다뤘던 것처럼 err와 data를 인자로 갖는다. 물론 고정적인 네이밍이 아니라 다른 이름으로 사용도 가능하다. 중요한 건 앞에가 err, 뒤가 data라는 것이다.
const fs = require('fs')
fs.readFile('test file.txt', 'utf8', (err, data) => {
if(err) {
throw err;
}
console.log(data);
});
위의 코드에서 fs.readFile을 통해 첫 번째 인자(경로)로 받은 파일의 내용을 읽는다. 만약 err가 있다면 반응을 하겠지만, 없다면 data로 받은 'test file.txt'의 내용을 그대로 출력한다.
callback과 promise 비교
// callback
const fs = require("fs");
const getDataFromFile = function (filePath, callback) {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
callback(err, null)
} else {
callback(null, data.toString())
}
})
};
//Promise
const getDataFromFilePromise = filePath => {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
reject(err)
} else {
resolve(data.toString())
}
})
})
// TODO: Promise 및 fs.readFile을 이용해 작성합니다.
};
callback을 통해 구현한 함수와 promise를 통해 구현한 함수지만 내용은 완전히 일치한다. (data를 문자열로 받는 이유는 이 스프린트에서 궁극적으로 리턴해야 하는 것이 배열 안에 들어 간 두 객체이기 때문에 문자열로 만들어준 후 마지막에 JSON.parse 과정을 거친다.)
basic chaining / promiseAll / async&await
세 코드는 같은 코드이다.
//경로 선언
const user1Path = path.join(__dirname, 'files/user1.json');
const user2Path = path.join(__dirname, 'files/user2.json');
//basic chaining
const readAllUsersChaining = () => {
return getDataFromFilePromise(user1Path)
.then((user1) => {
return getDataFromFilePromise(user2Path)
.then((user2) => {
return `[${user1}, ${user2}]`
});
})
.then((text) => JSON.parse(text));
//parse를 해주기 위해 일부러 user1, user2을 문자열로
}
//primise.all
let allUser1 = getDataFromFilePromise(user1Path)
let allUser2 = getDataFromFilePromise(user2Path)
const readAllUsers = () => {
return Promise.all([allUser1, allUser2])
.then(([user1, user2]) => {
return `[${user1}, ${user2}]`
})
.then((text) => JSON.parse(text));
}
//async&await
const readAllUsersAsyncAwait = async () => {
let allUser1 = await getDataFromFilePromise(user1Path)
let allUser2 = await getDataFromFilePromise(user2Path)
return [JSON.parse(allUser1), JSON.parse(allUser2)]
// TODO: async/await 키워드를 이용해 작성합니다
}
Author And Source
이 문제에 관하여(200427 TIL(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kwd8905/200427-TIL2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)