node 使用Promise解决地狱回调的问题
Promise有三种状态(生命周期)
①Pending (操作进行时)
②Resolved(操作成功)
③Rejected(操作失败)
Promise翻译过来就是承诺的意思 Promise接收一个函数有两个参数 resolve和reject 当承诺为resolve(成功)那么就会执行then方法的data来履行承诺,此时状态由Pending-->Resolved。如果承诺为reject(失败)就执行then的err 承诺被拒绝,此时状态由Pending-->Rejected(data和err是我自己取得形参名称)
回到我们上一篇博客写的地狱回调,用promise解决它
1 const fs = require("fs"); 2 3 fs.readFile("./a.txt", "utf-8", (err, data) => { 4 if (err) throw err; 5 console.log(data); 6 fs.readFile("./b.txt", "utf-8", (err, data) => { 7 if (err) throw err; 8 console.log(data); 9 fs.readFile("./c.txt", "utf-8", (err, data) => { 10 if (err) throw err; 11 console.log(data); 12 fs.readFile("./d.txt", "utf-8", (err, data) => { 13 if (err) throw err; 14 console.log(data); 15 }) 16 }) 17 }) 18 })
Promise是一个构造函数,我们使用new Promise实例化Promise
const fs = require("fs");
// Promise里面接受一个函数有两个参数,一个是承诺成功一种是 拒绝承诺
const p1 = new Promise((resolve, reject) => {
fs.readFile("./1.txt", "utf-8", (err, data) => {
if (err) {
reject(err) // 数据处理失败 Pending状态改为 Rejected
} else {
resolve(data) // 数据处理成功 Pending状态改为 Resolved
}
})
})
// 当承诺为resolve那么就会执行then方法的data来履行承诺,此时状态由Pending-->Resolved。如果承诺失败时就是执行then的err承诺被拒绝,此时状态由Pending-->Rejected
p1.then((data) => {
console.log(data)
}, (err) => {
console.log(err)
})
此时就打印出了第一个文件,如果打印第二个文件就在then里面继续返回promise就可以了
const fs = require("fs");
// Promise里面接受一个函数有两个参数,一个是承诺成功一种是 拒绝承诺
const p1 = new Promise((resolve, reject) => {
fs.readFile("./1.txt", "utf-8", (err, data) => {
if (err) {
reject(err) // 数据处理失败 Pending状态改为 Rejected
} else {
resolve(data) // 数据处理成功 Pending状态改为 Resolved
}
})
})
// 当承诺为resolve那么就会执行then方法的data来履行承诺,此时状态由Pending-->Resolved。如果承诺失败时就是执行then的err承诺被拒绝,此时状态由Pending-->Reject
p1.then((data) => {
console.log(data)
// 返回Promise
return new Promise((resolve, reject) => {
fs.readFile("./2.txt", "utf-8", (err, data) => {
if (err) {
reject(err) // 数据处理失败 Pending状态改为 Rejected
} else {
resolve(data) // 数据处理成功 Pending状态改为Resolved
}
})
})
}, (err) => {
console.log(err)
}).then((data) => {
// data就是履行上面代码返回的promise 承诺成功的状态
console.log(data)
}, (err) => {
console.log(err);
})
这样就将地狱回调改为函数串联的方式
我们可以封装一下这个操作 因为每个文件只是路径不一样
const fs = require("fs");
function pReadFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, "utf-8", (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
})
})
}
pReadFile("./1.txt")
.then((data) => {
console.log(data);
return pReadFile("./2.txt")
},(err) => {
console.log(err);
})
.then((data) => {
console.log(data);
return pReadFile("./3.txt")
},(err) => {
console.log(err)
})
.then((data) => {
console.log(data);
return pReadFile("./4.txt")
},(err) => {
console.log(err)
})
.then((data) => {
console.log(data)
}, (err) => {
console.log(err);
})
这样就解决了地狱回调的问题,如果你觉得还是看不懂的话,就多多写几遍,再去查相关资料总是能搞懂的

浙公网安备 33010602011771号