zoukankan      html  css  js  c++  java
  • 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);
        })

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

  • 相关阅读:
    磁盘
    磁盘接口
    Linux help websites
    [SOJ] 1282. Computer games (KMP)
    [SOJ]1753 解码
    hdu 3473 裸的划分树
    hdu 4417 划分树
    hdu 4665 搜索
    hdu 4340 树状DP
    hdu 4005 边连通度与缩点
  • 原文地址:https://www.cnblogs.com/qjuly/p/14510645.html
Copyright © 2011-2022 走看看