31、使用promise实现之前文件读取的案例
在引用util模块采用:遵循常见的错误优先的回调风格的函数(也就是将 (err, value) => ...
回调作为最后一个参数),并返回一个返回 promise 的对象方法
以及在链式拼接中return返回参数的参数实际上作用于了第二个链式的形参当中
链式调用的特点:
1、第一个then执行完会执行第二个then
2、then里面的函数的返回值,会被下一个then的形参接收
3、如果返回的是一个promise对象,下一个then的形参接收到的不是这个promise对象,而是这个promise对象内部调用resolve时候的实际参数
31.1、基础版
//基础版 const fs = require("fs"); const path = require("path"); let filePath1 = path.join(__dirname, "files", "1.txt"); let filePath2 = path.join(__dirname, "files", "2.txt"); let filePath3 = path.join(__dirname, "files", "3.txt"); let p1 = new Promise((resolve, reject)=>{ //1、同步代码 // console.log("同步代码"); // pending(进行中)、fulfilled(已成功)和rejected(已失败) //2、异步代码 fs.readFile(filePath1,"utf-8",(error1, data1)=>{ if(error1){ //失败的时候做的事情 reject(error1); } //读取完之后做的事情 resolve(data1) }) }); let p2 = new Promise((resolve, reject)=>{ //1、同步代码 // console.log("同步代码"); // pending(进行中)、fulfilled(已成功)和rejected(已失败) //2、异步代码 fs.readFile(filePath2,"utf-8",(error1, data1)=>{ if(error1){ //失败的时候做的事情 reject(error1); } //读取完之后做的事情 resolve(data1) }) }); let p3 = new Promise((resolve, reject)=>{ //1、同步代码 // console.log("同步代码"); // pending(进行中)、fulfilled(已成功)和rejected(已失败) //2、异步代码 fs.readFile(filePath3,"utf-8",(error1, data1)=>{ if(error1){ //失败的时候做的事情 reject(error1) } //读取完之后做的事情 resolve(data1) }) }); let str1 = ""; p1.then((data)=>{ str1+=data; return p2 },(error1)=>{ console.log("读取文件1失败", error1); return error1 }).then((data)=>{ str1+=data; return p3; }).then((data)=>{ str1+=data; console.log(str1); });
32.2、封装函数版
const fs = require("fs"); const path = require("path"); let filePath1 = path.join(__dirname, "files", "1.txt"); let filePath2 = path.join(__dirname, "files", "2.txt"); let filePath3 = path.join(__dirname, "files", "3.txt"); function readFilePromise(filePath){ return new Promise((resolve, reject)=>{ fs.readFile(filePath,"utf-8",(error1, data1)=>{ if(error1){ //失败的时候做的事情 reject(error1); } //读取完之后做的事情 resolve(data1) }) }); } let str1 = ""; readFilePromise(filePath1).then((data)=>{ str1+=data; return readFilePromise(filePath2) },(error1)=>{ console.log("读取文件1失败", error1); return error1 }).then((data)=>{ str1+=data; return readFilePromise(filePath3); }).then((data)=>{ str1+=data; console.log(str1); });
33.3、util版本
node中有一个util工具模块下,有一个promisify方法,这个方法相当于封装了一个返回promise对象的函数。
文档网址:util 实用工具 | Node.js API 文档
传入一个遵循常见的错误优先的回调风格的函数(即以 (err, value) => ...
回调作为最后一个参数),并返回一个返回 promise 的版本。
let readFilePromise = util.promisify(fs.readFile); //这一句代码相当于下面的整个函数的代码 // function readFilePromise(filePath){ // return new Promise((resolve, reject)=>{ // // fs.readFile(filePath,"utf-8",(error1, data1)=>{ // if(error1){ // //失败的时候做的事情 // reject(error1); // } // //读取完之后做的事情 // resolve(data1) // }) // }); // } // 总结 :util.promisify(fs.readFile) 得到一个promise对象
完整代码:
const fs = require("fs"); const path = require("path"); const util = require("util"); let filePath1 = path.join(__dirname, "files", "1.txt"); let filePath2 = path.join(__dirname, "files", "2.txt"); let filePath3 = path.join(__dirname, "files", "3.txt"); let filePath4 = path.join(__dirname, "files", "data.txt"); let readFilePromise = util.promisify(fs.readFile); let writeFilePromise = util.promisify(fs.writeFile); let str1 = ""; readFilePromise(filePath1).then((data)=>{ str1+=data; return readFilePromise(filePath2) },(error1)=>{ console.log("读取文件1失败", error1); return error1 }).then((data)=>{ str1+=data; return readFilePromise(filePath3); }).then((data)=>{ str1+=data; console.log(str1); writeFilePromise(filePath4, str1); });