现有三个md文件如下:
part1.md
part2.md
鱼遇.md
需求:读取以上三个文件的内容并输出。
首先,回顾一下用Promise的then链式调用读取多个文件是如何实现的呢?
代码如下:
//promise的then链式调用实现
//引入fs模块
const fs=require('fs');
const p=new Promise((resolve,reject)=>{
fs.readFile('./part1.md',(err,data)=>{
if(err){
reject(err);
}else{
resolve(data);
}
});
});
p.then(function(value){
return new Promise((resolve,reject)=>{
fs.readFile('./part2.md',(err,data)=>{
if(err){
reject(err);
}else{
resolve([value,data]);
}
})
})
}).then(function(value){
return new Promise((resolve,reject)=>{
fs.readFile('./鱼遇.md',(err,data)=>{
if(err){
reject(err);
}else{
value.push(data);
resolve(value);
}
})
})
}).then(value=>console.log(value.join('\r\n')));
首先要知道,调用then方法,返回的结果是Promise对象,对象状态由回调函数的返回结果决定。此处利用了其中一种情况:如果回调函数返回的是一个成功的Promise对象,那么then方法的返回值是一个PromiseStatus为resolved,PromiseValue为成功信息的Promise对象,后续链式调用同理。
接下来看另一种实现方法——async和await结合读取多个文件
代码如下:
//1、引入fs模块
const fs=require('fs');
//读取part1.md
function readPart1(){
return new Promise((resolve,reject)=>{
fs.readFile('./part1.md',(err,data)=>{
if(err){
reject(err);
}else{
resolve(data);
}
})
});
}
//读取part2.md
function readPart2(){
return new Promise((resolve,reject)=>{
fs.readFile('./part2.md',(err,data)=>{
if(err){
reject(err);
}else{
resolve(data);
}
})
});
}
//读取鱼遇.md
function readMeet(){
return new Promise((resolve,reject)=>{
fs.readFile('./鱼遇.md',(err,data)=>{
if(err){
reject(err);
}else{
resolve(data);
}
})
});
}
//await表达式要放在async函数中
//声明一个async函数
async function readLyrics(){
let part1=await readPart1();
let part2=await readPart2();
let meet=await readMeet();
console.log(part1.toString());
console.log(part2.toString());
console.log(meet.toString());
}
readLyrics();
这个方法利用的是:“await p表达式的值为Promise对象p的PromiseValue值”,因此async函数中part1、part2、meet即为读取三个文件的结果,然后挨个输出就行啦~
输出结果: