层层嵌套的异步函数的操作叫做回调地狱,它不便于代码的维护,相当复杂。
那么我们又该如何解决回调地狱呢?
我们可以用promise解决。
那么promise有什么状态呢?
pending: 初始状态,既不是成功状态,也不是失败状态
fulfilled: 操作成功完成
rejected: 操作失败
注意:Promise本身只是个容器,不是异步的,其中要完成的任务才是异步的。
then方法接受的第一个函数的参数,对应着生成Promise函数中接收的resolve;第二个函数的参数,对应着reject.
then方法的执行结果是一个promise。我们可以连接任意一个then,前一个then的回调结果将作为参数传递给下一个then回调。
那么接下来便是我们需要解决回调地狱的操作
var p1 = new Promise((resolve, reject) => {
fs.readFile('./views/demo1.html', (err, data) => {
if (err) {
reject(err);
}
resolve(data);
})
})
var p2 = new Promise((resolve, reject) => {
fs.readFile('./views/demo2.html', (err, data) => {
if (err) {
reject(err);
}
resolve(data);
})
})
p1.then((data) => {
console.log(data.toString());
return p2;
}, (err) => {
console.log('错误', err)
}).then((data) => {
console.log(data);
} )
然后我们进行封装
function pReadFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
if (err) {
reject(err);
}
resolve(data);
})
})
}
var p1 = pReadFile('./views/demo1.html');
var p2 = pReadFile('./views/demo2.html');
p1.then((data) => {
console.log(data.toString());
return p2;
}, (err) => {
console.log('错误', err)
}).then((data) => {
console.log(data.toString());
} )
那么我们就此解决回调地狱了,也简化了之前的代码,回调地狱也就说到这里了