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); })
这样就解决了地狱回调的问题,如果你觉得还是看不懂的话,就多多写几遍,再去查相关资料总是能搞懂的