回调地狱callback-hell
同样是读文件的操作,因为读文件是异步操作所以文件的读取并不会按照代码的顺序来输出
var fs = require('fs')
fs.readFile('./a.txt','utf8',function(err,data){
if(err){
throw err
}console.log(data)
})
fs.readFile('./b.txt','utf8',function(err,data){
if(err){
throw err
}console.log(data)
})
fs.readFile('./c.txt','utf8',function(err,data){
if(err){
throw err
}console.log(data)
})
[外链图片转存失败(img-p3z0TT9O-1564741746893)(C:\Users\14331\AppData\Roaming\Typora\typora-user-images\1564382564978.png)]
若想要实现顺序读取,则要使用代码嵌套的方式,此时执行过程为必须等a输出后才会读b,必须b输出后才会读c即回调地狱,将b放到a的回调函数里面,将c放到b的回调函数里面。
var fs = require('fs')
fs.readFile('./a.txt','utf8',function(err,data){
if(err){
throw err
}console.log(data)
fs.readFile('./b.txt','utf8',function(err,data){
if(err){
throw err
}console.log(data)
fs.readFile('./c.txt','utf8',function(err,data){
if(err){
throw err
}console.log(data)
})
})
})
[外链图片转存失败(img-enrEUQxy-1564741746896)(C:\Users\14331\AppData\Roaming\Typora\typora-user-images\1564382726972.png)]
使用promise方法解决
[外链图片转存失败(img-PcV76fNz-1564741746899)(C:\Users\14331\AppData\Roaming\Typora\typora-user-images\1564387060256.png)]
[外链图片转存失败(img-YD3KwmEP-1564741746900)(C:\Users\14331\AppData\Roaming\Typora\typora-user-images\1564387012232.png)]
var fs = require('fs')
//new Promise()创建一个promise容器,promise是ES6的语法,当它被创建时会自动调用
//promise容器有三种状态,第一种为pendding正在执行态,jejected已经失败态,resolved已经成功态
var p1 = new Promise(function(resolve,reject){
fs.readFile('./a.txt','utf8',function(err,data){
if(err){
reject(err)
}else{
resolve(data)//成功后执行then,function(data)=resolve(data)
}
})
})
var p2 = new Promise(function(resolve,reject){
fs.readFile('./b.txt','utf8',function(err,data){
if(err){
reject(err)
}else{
resolve(data)
}
})
})
var p3 = new Promise(function(resolve,reject){
fs.readFile('./c.txt','utf8',function(err,data){
if(err){
reject(err)
}else{
resolve(data)
}
})
})
//此时的data就是读取成功返回的数据,第一个参数就是resolve(data),第二个参数就是reject(err)
p1.then(
function(data){
console.log(data)
return p2//此时返回的时p2实例
},
function(err){
console.log('读取文件失败了',err)
}).then(
function(data){
console.log(data)
return p3//此时返回的时p3实例
},
function(err){
console.log('读取文件失败了',err)
}).then(
function(data){
console.log(data)
},
function(err){
console.log('读取文件失败了',err)
})
封装promise方法
var fs = require('fs')
//new Promise()创建一个promise容器,promise是ES6的语法,当它被创建时会自动调用
//promise容器有三种状态,第一种为pendding正在执行态,jejected已经失败态,resolved已经成功态
function Preadfile(pathfile){
return new Promise(function(resolve,reject){
fs.readFile(pathfile,'utf8',function(err,data){
if(err){
reject(err)
}else{
resolve(data)
}
})
})
}
Preadfile('./a.txt')
.then(function(data){
console.log(data)
return Preadfile('./b.txt')
}).then(function(data){
console.log(data)
return Preadfile('./c.txt')
}).then(function(data){
console.log(data)
})