美文网首页
nodejs同步读取文件的方法总结

nodejs同步读取文件的方法总结

作者: squidbrother | 来源:发表于2019-09-29 10:56 被阅读0次
    概述

    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);
    });
    

    相关文章

      网友评论

          本文标题:nodejs同步读取文件的方法总结

          本文链接:https://www.haomeiwen.com/subject/umpxuctx.html