首先简单介绍下Promise
解释在程序的注释里
//1.Promise是一个构造函数,我们可以new Promise()得到一个Promise的实例
//2.在Promise上,有两个函数,分别是resolve(成功之后的回调函数)和reject(失败之后的回调函数)
//3.在Promise构造函数的Prototype属性上,有一个.then()方法,只要是Promise构造函数创建的实例,
//都可以访问到.then()方法
//4.Promise表示一个异步操作,每当我们new一个Promise的实例,就表示一个具体的异步操作
//5.异步操作的结果两种状态:异步执行成功了,需要在内部调用成功的回调函数resolve把结果返回给调用者;
// 异步执行失败了,需要在内部调用失败的回调函数reject把结果返回给调用者。
//6.由于是异步操作,内部拿到操作的结果后,无法使用return把操作的结果返回给调用者;这时候,只能
//使用回调函数的形式,来把成功或失败的结果,返回给调用者。
//7.可以在new出来的Promise实例上,调用.then()方法,预先为这个Promise异步操作指定成功(resolve)和失败(reject)的回调函数
const fs = require('fs')
//每当new一个promise实例,就会执行这个异步操作中的代码
// var promise = new Promise(function(){
// //这个function内部写的就是具体的异步操作
// fs.readFile('./1.txt','utf-8',(err,dataStr) => {
// if (err) {
// throw err
// }
// console.log(dataStr)
// })
// })
function getFileByPath(fpath){
return new Promise(function(resolve,reject){
//这个function内部写的就是具体的异步操作
fs.readFile(fpath,'utf-8',(err,dataStr) => {
// if (err) {
// throw err
// }
// console.log(dataStr)
if (err) return reject(err)
resolve(dataStr)
})
})
}
getFileByPath('./1.txt')
.then(function(data){
console.log(data+'-------')
},function(err){
console.log(err.message)
})
接下来开始解决回调地狱的问题
注释掉的部分是解除后续Promise对前面Promise依赖的调用方式
(即哪怕前面的Promise执行失败了,但是不要影响后续Promise的正常执行。)
const fs = require('fs')
function getFileByPath(fpath){
return new Promise(function(resolve,reject){
fs.readFile(fpath,'utf-8',(err,dataStr) => {
if (err) return reject(err)
resolve(dataStr)
})
})
}
//先读取文件1,再读取2,最后读取3
//在上一个.then中返回一个新的Promise实例,可以继续用下一个.then来处理
//如果前面的Promise执行失败,我们不想让后续的Promise操作被终止,我们可以为每个promise制定失败的回调
// getFileByPath('./11.txt')
// .then(function(data){
// console.log(data)
// return getFileByPath('./2.txt')
// },function(err){
// console.log('这是失败的结果:'+err.message)
// //return一个新的Promise对象
// return getFileByPath('./2.txt')
// })
// .then(function(data){
// console.log(data)
// return getFileByPath('./3.txt')
// })
// .then(function(data){
// console.log(data)
// })
// console.log('OKOKOK')
//当我们的需求是:哪怕前面的Promise执行失败了,但是不要影响后续Promise的正常执行,此时,
//我们可以单独为每个promise,通过.then指定一下失败的回调。
//如果我们的需求是:如果后续的Promise依赖于前面Promise执行的结果,如果前面的失败了,则后面的
//就没有继续执行下去的意义了,此时我们想要实现一旦有报错就立即终止所有Promise的执行。
getFileByPath('./1.txt')
.then(function(data){
console.log(data)
return getFileByPath('./22.txt')
})
.then(function(data){
console.log(data)
return getFileByPath('./3.txt')
})
.then(function(data){
console.log(data)
})
.catch(function(err){//如果前面有任何的Promise执行失败,则立即终止所有Promise的执行,并
// 马上进入catch去处理Promise中抛出的异常。
console.log('这是自己的处理方式:'+err.message)
})