1.demo目录

1.text ,2.text , 3.text;内容随意填;
2.test.js
const fs = require('fs')
const path = require('path')
//封装的读文件方法;传路径;返回内容;
function getFileByPath(fpath, succCd, errcd) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {//异步读取;需要懂回调;
if (err) return errcd(err)//失败的回调
// return dataStr
succCd(dataStr) //成功的回调;
})
}
// 这里是调用一次试试;
getFileByPath(path.join(__dirname, './file/2.text'),function (data) {
console.log(data);
},function (err) {
console.log(err)
});
需求:先读取文件1,在读取文件2,最后读取文件三;
getFileByPath(path.join(__dirname, './file/1.text'), function (data) {
console.log(data);
getFileByPath(path.join(__dirname, './file/2.text'), function (data) {
console.log(data);
getFileByPath(path.join(__dirname, './file/3.text'), function (data) {
console.log(data);
}, function (err) {
console.log(err)
});
}, function (err) {
console.log(err)
});
}, function (err) {
console.log(err)
});
思考:如果有很多文件要读;就属于回调地狱–可用es6中promise解决回调地狱问题-------
promise的本质是;单纯的解决回调地狱的问题,并不能减少代码量;
1.promise是一个构造函数;需要 new Promise()得到一个实例对象;
2.在promise上,有两个函数;分别是resolve(成功之后的回调)和reject(失败之后的回调)
3.在promise构造函数prototype属性上;有一个 .then() 方法;也就是说,只要是promise构造函数创建的实例,都可以访问
.then()方法
4. promise表示一个异步操作;每当我们new 一个promise 的实例;这个实例,就表示一个具体的异步操作;
5. 既然promise创建的实例,是一个异步操作,那么,这个异步操作的结果;只能有两种状态;
5.1 状态1:成功(resolve)
5.2 状态2:失败(reject)
5.3 promise的实例;是一个异步操作;所以,内部拿到的操作结果后,无法使用return 返回给调用者,这个
时候使用回调函数的形式;把成功或者失败的回调返回给调用者;
6. 我们可以再new 出来的promise 实例上,调用.then()方法,【预先】为这个promise异步处理操作;指定成功和失败的回调函数;
// 创建promise对象;创建一个异步操作的;
// 需求先读取文件1,在读取文件2,最后读取文件三;
// 每当new 一个promise实例的时候,就会立即执行这个异步操作中的代码;也就是说。new的时候,
//除了能得到一个promise实例之外还会立即调用(!!!!!)
// promise构造函数传递的那个function
var promise = new Promise(function () {
// 这个function内部写的是具体的异步操作;
//读取文件1.text
fs.readFile(path.join(__dirname, './file/1.text'), 'utf-8', (err, dataStr) => {
if (err) throw err;
console.log(dataStr)
})
})
如果需要;想调用的时候执行;就要用function包裹起来; 当调用方法的时候才开始读去文件;
function GetFileByPath(fpath) {
return new Promise(function (resolve,reject) {
// 这个function内部写的是具体的异步操作;
//读取文件1.text
fs.readFile(path.join(__dirname, fpath), 'utf-8', (err, dataStr) => {
if(err) return reject(err)
resolve(dataStr)
})
})
}
GetFileByPath('./file/1.text')
.then(function (data) {
console.log(data)//读取文件1.text;
return GetFileByPath('./file/2.text')
//这里return出去一个新的promise对象;可以再.then()后边继续.then();
}, function (err) {
// 失败的function可以省略不写;
})
.then(function (data) {//这里.then()是上一步操作中返回的promise
console.log(data)
return GetFileByPath('./file/3.text')
})
.then(function (data) {
console.log(data)
})