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);
    })

这样就解决了地狱回调的问题,如果你觉得还是看不懂的话,就多多写几遍,再去查相关资料总是能搞懂的

 

posted @ 2021-03-10 11:43  珊迪·奇克斯  阅读(144)  评论(0编辑  收藏  举报