Promise
1. Promise 的基本概念
2. 基于 then-fs 读取文件内容
node.js 官方提供的js 模块仅支持以回调函数的方式读取文件,不支持 Promise 的调用方式,需要安装 then-fs
以支持Promise
1 2 3 4 5
| import thenFs from "then-fs";
thenFs.readFile("./test_file/1","utf-8").then(r1=>console.log(r1),err=>console.log(err)); thenFs.readFile("./test_file/2","utf-8").then(r2=>console.log(r2),err=>console.log(err)); thenFs.readFile("./test_file/3","utf-8").then(r3=>console.log(r3),err=>console.log(err));
|
2.1 then() 方法的特性
2.2 顺序读取文件-链式调用
1 2 3 4 5 6 7 8 9 10
| thenFs.readFile("./test_file/1",'utf-8') .then(r1=>{ console.log(r1); return thenFs.readFile("./test_file/2","utf-8"); }).then(r2=>{ console.log(r2); return thenFs.readFile("./test_file/3","utf-8") }).then(r3=>{ console.log(r3); })
|
2.3 通过 .catch 捕获错误
- catch 写最后:中间出错,后面的.then都不执行;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| thenFs.readFile("./test_file/1111",'utf-8') .then(r1=>{ console.log(r1); return thenFs.readFile("./test_file/2","utf-8"); }).then(r2=>{ console.log(r2); return thenFs.readFile("./test_file/3","utf-8") }).then(r3=>{ console.log(r3); }).catch(err=>{ console.log(err); })
|
- catch 提前:捕获错误后,后面的.then正常执行;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| thenFs.readFile("./test_file/11",'utf-8') .catch(err=>{ console.log(err); }) .then(r1=>{ console.log(r1); return thenFs.readFile("./test_file/2","utf-8"); }).then(r2=>{ console.log(r2); return thenFs.readFile("./test_file/3","utf-8") }).then(r3=>{ console.log(r3); })
|
2.4 Promise.all()方法
Promise.all() 发起并行的Promise异步操作,等所有的异步操作全部结束后才会执行下一步的.then操作(等待机制)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import thenFs from "then-fs";
const read_arr = [ thenFs.readFile("./test_file/1",'utf-8'), thenFs.readFile("./test_file/2",'utf-8'), thenFs.readFile("./test_file/3",'utf-8'), ]
Promise.all(read_arr) .then(result=>{ console.log(result); }) .catch(err=>{ console.log(err); })
|
2.5 Promise.race() 方法
只要任何一个异步操作完成,就立即执行下一步的.then操作(赛跑机制).
3. 基于 Promise 封装读取文件的方法
封装要求:
- 方法:getFile(file_path)
- 返回:Promise实例对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import fs from "fs";
function getFile(file_path){ return new Promise((resolve,reject)=>{ fs.readFile(file_path,'utf-8',(err,dataStr)=>{ if(err) return reject(err); resolve(dataStr); }) }); }
getFile("./test_file/11") .then(res=>{ console.log(res); }) .catch(err=>{ console.log(err); })
|