nodejs同步读取文件的方法总结
2019-09-29 本文已影响0人
squidbrother
概述
fs.readFile()是异步操作,如果希望按照同步的风格书写,返回的数据是undefined
读取文件的数据
./module/mime.json
{
".html":"text/html",
".css":"text/css",
".js":"text/javascript",
".jpeg":"image/jpeg"
".png":"image/png"
}
fs.readFile()例子:
const fs = require('fs');
const util = require('util');
const events = require('events');
let testpath = './module/mime.json';
function readMes(){
fs.readFile(testpath,(err,data)=>{
if(!err){
return JSON.parse(data.toString());
}else{
console.log('readFile error');
}
})
}
console.log(readMes()); //undefined
所以为了更好的读取文件信息,且同步书写,需要特殊的处理,
总结有如下方式:
1.利用事件处理器,发布异步数据结果;利用监听收取最终数据
2.封装一个函数,利用callback将最终异步结果作为参数,供后续操作使用
3.利用promise对fs.readFile进行封装,最终结果在then中获取
4.使用fs.readFileSync同步读取文件
5.利用util.promisify返回promise特性,封装函数,同步读取文件数据
除了fs.readFileSync,剩余的核心思路还是将数据作为回调数据,
函数中的回调;
promise中的then中的回调(自己封装promise,或者使用util.promisify()包装一个);
事件处理器中的回调;
1.利用事件触发器,广播与接收广播,实现同步读取文件的数据
const fs = require('fs');
const util = require('util');
const events = require('events');
let util_readFile = util.promisify(fs.readFile);
let testpath = './module/mime.json';
let my_event1 = new events.EventEmitter();
function readMes(){
fs.readFile(testpath,(err,data)=>{
if(!err){
my_event1.emit('aaa',JSON.parse(data.toString()));
}else{
console.log('readFile error');
}
})
}
my_event1.on('aaa',(data)=>{
console.log(data['.html']); //text/html
});
setTimeout(()=>{
readMes();
},2000);
2.利用回调,同步读取文件
const fs = require('fs');
const util = require('util');
let util_readFile = util.promisify(fs.readFile);
let testpath = './module/mime.json';
function readMes(cb){
fs.readFile(testpath,(err,data)=>{
if(!err){
cb(JSON.parse(data.toString()));
}else{
console.log('readFile error');
}
})
}
readMes(function(data){
console.log(data['.jpg']); //image/jpeg
});
3.使用promise,同步读取文件
const fs = require('fs');
const util = require('util');
let testpath = './module/mime.json';
async function readMes(){
return await new Promise((res,rej)=>{
try{
fs.readFile(testpath,(err,data)=>{
if(!err){
res(JSON.parse(data.toString()));
}else{
console.log('readFile error');
}
})
}catch(err){
rej(err);
}
})
}
readMes().then((data)=>{
console.log(data['.css']);
}).catch((err)=>{
console.log(err);
})
4.使用fs.readFileSync同步读取文件
const fs = require('fs');
const util = require('util');
let util_readFile = util.promisify(fs.readFile);
let testpath = './module/mime.json';
function fn1(){
try{
var resData = JSON.parse(fs.readFileSync(testpath).toString());
return resData['.png'];
}catch(err){
console.log(err);
}
}
console.log(fn1()); //image/png
5.利用util.promisify返回promise特性,封装函数,同步读取文件数据
node 8.0 以上支持的 util.promisify() 方法
const fs = require('fs');
const util = require('util');
let util_readFile = util.promisify(fs.readFile);
let testpath = './module/mime.json';
function fn1(){
try{
return util_readFile(testpath);
}catch(err){
console.log(err);
}
}
fn1().then((data)=>{
var resData = JSON.parse(data.toString());
console.log(resData['.css']); //text/css
}).catch((err)=>{
console.log(err);
});