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);
});
上一篇下一篇

猜你喜欢

热点阅读