普通文件讀取方式
const fs = require('fs')
const path = require('path')
fs.readFile(path.join(__dirname, './files/1.txt'), 'utf-8', (err, dataStr) => {
if (err) throw err
console.log(dataStr)
})
封裝成函數(shù)的方式(有漏洞)
const fs = require('fs')
const path = require('path')
function getFileByPath(fpath) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
// 如果報(bào)錯(cuò)了,進(jìn)入if分支后梨撞,if后面的代碼就沒有必要執(zhí)行了
if (err) return throw err
return dataStr
})
// 當(dāng)系統(tǒng)碰到文件讀取的時(shí)候,會(huì)異步執(zhí)行,這個(gè)讀取程序,被移出當(dāng)前流程,然后往下走,發(fā)現(xiàn)沒代碼執(zhí)行了
// 于是函數(shù)在沒有return結(jié)果的情況下,默認(rèn)返回undefined
}
var res = getFileByPath(path.join(__dirname, './files/1.txt'))
console.log(res)
// 注:這樣的代碼,這里console.log(res) 打印的只會(huì)是undefined,根本拿不到文件的內(nèi)容
//原因就是上面的fs.readfile 是異步的
解決上面的問題(回調(diào)函數(shù))
const fs = require('fs')
const path = require('path')
// 我們可以規(guī)定一下碾褂, callback 中,有兩個(gè)參數(shù)囚灼,第一個(gè)參數(shù)螃宙,是 失敗的結(jié)果;第二個(gè)參數(shù)是成功的結(jié)果慨仿;
// 同時(shí),我們規(guī)定了: 如果成功后纳胧,返回的結(jié)果镰吆,應(yīng)該位于 callback 參數(shù)的第二個(gè)位置,此時(shí)跑慕, 第一個(gè)位置
// 由于沒有出錯(cuò)万皿,所以摧找,放一個(gè) null; 如果失敗了牢硅,則 第一個(gè)位置放 Error對(duì)象蹬耘,第二個(gè)位置放置一個(gè)
// undefined
function getFileByPath(fpath, callback) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
// 如果報(bào)錯(cuò)了,進(jìn)入if分支后减余,if后面的代碼就沒有必要執(zhí)行了
if (err) return callback(err) // 注意這里的return作用不是返回回調(diào)函數(shù)執(zhí)行的結(jié)果,而是阻止函
// 數(shù)往下繼續(xù)運(yùn)行
// console.log(dataStr)
// return dataStr
callback(null, dataStr)
})
}
getFileByPath(path.join(__dirname, './files/11.txt'), (err, dataStr) => {
if (err) return console.log(err.message)
console.log(dataStr)
})