对Promise异步操作的理解
promise的本质其实就是为了解决回调地狱的问题,但是虽然解决了回调地狱的问题但是代码量并没有减少,实际上就是将回调地狱中的嵌套关系变成了串联的形式。
回调地狱
getFileByPath(path.join(__dirname,'./files/1.txt'),(dataStr)=>{
console.log(dataStr);
getFileByPath(path.join(__dirname,'./files/2.txt'),(dataStr)=>{
console.log(dataStr);
getFileByPath(path.join(__dirname,'./files/3.txt'),(dataStr)=>{
console.log(dataStr);
})
})
})
1.Promise:是一个构造函数,既然是一个构造函数,我们就可以通过new Promise()创建一个Promise实例
2.在Promise上有两个函数分别是resolve(成功的回调函数)、reject(失败的回调函数)
3.在Promise构造函数的prototype上有一个then()方法,所以说只要是promise创建的实例对象都可以访问.then这个方法
4.promise表示一个异步操作,每当我们new一个Promise实例,这个实例就表示一个具体的异步操作
5.既然Promise创建的实例是异步操作,那么这个异步操作的结果只有两种
5.1 状态一:异步操作成功了,需要调用成功的回调函数resolve,将结果返回给调用者
5.2 状态二:异步操作失败了,需要调用失败的回调函数reject,将结果返回给调用者
5.3 由于promise创建的实例是一个异步操作,所以内部拿到的操结结果,无法使用return把操作的结果返回给调用者,这时候只能使用回调函数的形式,来把成功或失败的结果返回给调用者
6.可以在new出来的Promise实例对象上调用.then()方法,(预先)为这个Promise异步操作指定成功(resolve)和失败(reject)的回调函数
总结:每当new一个promise实例的时候,就会立即执行这个异步操作中的代码
也就是说在new实例的时候除了能得到一个promise实例外,还会立即调用我们在Promise中传递的function,执行这个function中的异步操作代码
const fs=require('fs');
function getFileByPath(fpath){
return new Promise(function(resolve,reject){
fs.readFile(fpath,(err,dataStr)=>{
if(err) return reject(err);
resolve(dataStr);
})
})
}
/* getFileByPath('./files/11.txt')
.then(function(data){
console.log(data);
//读取文件2
return getFileByPath('./files/2.txt');
},function(err){
console.log('这是失败的回调'+err.message);
return getFileByPath('./files/2.txt')
})
.then(function(data){
console.log(data);
//读取文件3
return getFileByPath('./files/3.txt')
})
.then(function(data){
console.log(data);
})
console.log('OKOKOK'); */
getFileByPath('./files/11.txt')
.then(function(data){
console.log(data);
//读取文件2
return getFileByPath('./files/2.txt');
})
.then(function(data){
console.log(data);
//读取文件3
return getFileByPath('./files/3.txt')
})
.then(function(data){
console.log(data);
})
.catch(function(err){
console.log('这是'+err.message)
})
/* **catch的作用:如果前面有任何的promise执行失败,则立即终止所有的promise执行,并且立即进入catch 去处理promise抛出的异常** */
/*