美文网首页
基于promise的fs文件操作函数封装

基于promise的fs文件操作函数封装

作者: Mr无愧于心 | 来源:发表于2018-09-19 11:15 被阅读0次
需求:

封装fs模块的所有api返回一个promise对象使之能够实现链式操作,避免回调地狱。

目录./utils/fsPromise

let fs=require('fs');
let path=require('path');
let dirname = path.resolve();//存储的是当前模块执行所在的绝对路径
//单独封装示例
/*function readFile(url){
  return new Promise(function(resolve,reject){
    fs.readFile(url,'utf8',function(err,data){
      if(err){
        reject(err);
        return;
      }
      resolve(data);
    })
  })
};*/
//批量封装

//(读取类)
['mkdir', 'rmdir', 'readdir', 'readFile', 'copyFile', 'unlink'].forEach(function (item){
    exports[item] = function (pathname, copypath = '') {
        pathname = path.resolve(dirname, pathname);
        console.log(pathname)
        copypath = path.resolve(dirname, copypath);
        return new Promise(function (resolve, reject) {
            let arg = [function (err, data) {
                if (err) {
                    reject(err);
                    return;
                }
                resolve(data || '');
            }];
            item === 'readFile' ? arg.unshift('utf8') : null;
            item === 'copyFile' ? arg.unshift(copypath) : null;
            fs[item](pathname, ...arg)
        })
    }
});
//(写入类)
['writeFile', 'appendFile'].forEach(function (item) {
    exports[item] = function (pathname, content) {
        pathname = path.resolve(dirname, pathname);
        if (typeof content !== 'string') {
            content = JSON.stringify(content)
        };
        return new Promise(function (resolve, reject) {
            fs[item](pathname,content,'utf8',function(err,data){
                if (err) {
                    reject(err);
                    return;
                }
                resolve(data || '')
            })
        })
    }
})
调用
//=>合并并且压缩CSS
let {readFile, readdir, writeFile} = require('./utils/fsPromise');//引入要使用的方法

//1.先把所有的CSS文件读取出来
readdir('less').then(result => {//获取less文件下的css文件
    return result.filter(item => /\.CSS$/i.test(item));
}).then(result => {//读取less文件下的css文件内容
    let arg = [];
    result.forEach(item => {
        arg.push(readFile(`less/${item}`));//=>分别调取READ-FILE方法,读取捕捉到的CSS文件,向数组中依次增加读取各个文件的PROMISE实例
    });
    //arg=[promise1,promise2...]  Promise.all:等待数组中所有的PROMISE实例都执行成功才算成功
    return Promise.all(arg);
}).then(result => {//把读取的每个文件的内容进行拼接
    //=>RESULT:一个数组,存放所有文件读取的内容
    result = result.join('');
    return result.replace(/( |\n|\r)/g, '');
}).then(result => {//写入一个新的文件中(没有的话会自动创建这个文件)
    return writeFile('less/build.min.css', result);
}).then(() => {
    console.log('创建成功');
});

相关文章

网友评论

      本文标题:基于promise的fs文件操作函数封装

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