1. 程式人生 > 實用技巧 >01 fs模組

01 fs模組

1 fs.readFile

非同步執行函式

/**
 fs 讀取檔案相對路徑是相對終端命令列所在的路徑
process.cwd()返回終端命令列的絕對路徑
 * 
 */

fs = require('fs')
fs.readFile('./static/1.txt', (err, data) => {
  if (err) {
    console.log(err.message);
    return
  }
  console.log(data); //二進位制
  console.log(data.toString()); //二進位制轉字串
})
// 如果指定了編碼格式,data就直接是字串 ./可以省略'static/test/test.js'=='./static/test/test.js'
fs.readFile('static/test/test.js', 'utf8', (err, data) => { if (err) return console.log(data); })

// 要求:在第一個非同步任務讀取成功之後再讀取第二個非同步任務, 第二成功後,在讀取第三個非同步任務

const fs = require('fs');

fs.readFile('./static/1.txt', (err, data) => {
  if (err) throw err
  console.log(data.toString());
  fs.readFile(
'./static/2.txt', (err, data) => { if (err) throw err console.log(data.toString()); fs.readFile('./static/3.txt', (err, data) => { if (err) throw err console.log(data.toString()); }) }) })

promise 管理下

new Promise((resolve, reject) => {
  fs.readFile('./static/1.txt', (err, data) => {
    
if (err) reject(err) else resolve(data) }) }).then(data => { console.log(data.toString()); return new Promise((resolve, reject) => { fs.readFile('./static/2.txt', (err, data) => { err ? reject(err) : resolve(data) }) }) }).then(data => { console.log(data.toString()); return new Promise((resolve, reject) => { fs.readFile('./static/3.txt', (err, data) => { err ? reject(err) : resolve(data) }) }) }).then(data => console.log(data.toString())).catch(err => console.log(err.message))

封裝讀取promise的fs.readFile

function getFileByPath(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, (err, data) => {
      err ? reject(err) : resolve(data)
    })
  })
}

getFileByPath('./static/1.txt').then(data => {
  console.log(data.toString());
  return getFileByPath('./static/2.txt')
}).then(data => {
  console.log(data.toString());
  return getFileByPath('./static/3.txt')

}).then(data => console.log(data.toString())).catch(err => console.log(err))

//Promise.all([promise1,promise2,...])返回一個新的promise物件,只有都成功才執行then 返回資料也是一個數組 ,只要其中有一個失敗,就直接走了catch
//適合頁面發起多個ajax請求
const promise1 = getFileByPath('./static/1.txt')
const promise2 = getFileByPath('./static/2.txt')
const promise3 = getFileByPath('./static/3.txt')

Promise.all([promise1, promise2, promise3]).then(data => console.log(data)).catch(err => console.log(err.message))
async function fn() {
  const data1 = await promise1
  const data2 = await promise2
  const data3 = await promise3
  return [data1.toString(), data2.toString(), data3.toString()]
}
fn().then(data => console.log(data)).catch(err => err)