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 키워드를 이용해 작성합니다
}

좋은 웹페이지 즐겨찾기