非同步讀取檔案方式—Async

node.js 中當我們要讀取檔案時,常常會採用循序漸進的方式,有時一次想讀取多的檔案,程式碼就會變得很長,或是需要寫個function達成這件事。
通常,若要讀取檔案,我們會用這種方式:

// 一般讀取檔案方式

const fs = require('fs');
const path = require('path');

fs.readFile(path.join(__dirname, 'package.json'), 'utf-8',
   function(err, result) {
      if(err) { return console.error(err); }

      try {
         const object = JSON.parse(result);
      } catch(ex) {
         return console.error(ex);   // [SyntaxError: Unexpected string]
      }
      // console.log(object.name);
   }
);

一次要讀寫多個檔案,就必須要重複上面動作幾次,對於懶惰的工程師來說當然不可能作這件事,於是node.js套件 async 就應運而生。
使用前當然要先安裝:

$>npm install async --save

安裝成功後,就可以開始改寫上面程式:

const fs = require('fs');
const path = require('path');
const async = require('async'); 

async.map(['package.json', 'xx.json'],
   function(name, callback) {
      fs.readFile(path.join(__dirname, name), 'utf-8',
         function(err, result) {
            if(err) { return callback(err); }

            try {
               const object = JSON.parse(result);
            } catch(ex) {
               return callback(ex);   // [SyntaxError: Unexpected string]
            }
            callback(null, object.name);
         }
      );
   },
   function(err, results) {
      console.log(results);
   }
);

如此就可以輕鬆讀取多個檔案啦,是不是很方便呢?

Promises

當我們讀取完檔案內容後,接著要做相關事情時,不能直接讀了就接著開始做,需要先確認檔案讀取完畢後才能開始進行下個動作,否則程式會出錯,因此,就必須要使用Promise,傳統的檔案讀取方式如下:

fs.readFile('./package.json', 'utf-8', function (err, data) {  
  if (err) {
    return console.log(err)
  }

  try {
    JSON.parse(data)
  } catch (ex) {
    return console.log(ex)
  }
  console.log(data.name)
})

改用這個方式程式碼看起來會簡潔許多:

fs.readFileAsync('./package.json').then(JSON.parse).then((data) => {  
  console.log(data.name)
})
.catch((e) => {
  console.error('error reading/parsing file', e)
})