Node.js之Promise认识

promise是node.js的对象,它是一个构造函数,作用是将异步操作以同步操作的流程表达出来。解决Node.js异步编程中回调地狱的问题。

语法:

const fs = require('fs');

//通过promise 能把 异步API的执行 和 正确/错误的处理 进行了分离 这样就能够解决回调地狱的问题

//resolve和reject实际上就是两个函数;如果下面异步API执行成功了就调用resolve,如果失败了就调用reject

//通过resolve和reject就可以把err和result的值拿到promise的外面

let promise = new Promise((resolve, reject) => {

    fs.readFile('./1.txt', 'utf8', (err, result) => {

        if (err != null) {

            reject(err);

        } else {

            resolve(result);

        }

    });

});

//then下面的回调函数相当于调用了上面的resolve()函数;把上面的result实参传递给这里回调函数的形参

//catch下面的回调函数相当于调用了上面的reject()函数;把上面的err实参传递给这里回调函数的形参

promise.then((result) => {

        console.log(result);

    })

    .catch((err) => {

        console.log(err);

    })

案例:

//需求:依次读取1.txt、2.txt、3.txt三个文件

const fs = require('fs');

//回调地狱代码(异步API嵌套问题)

// fs.readFile('./1.txt', 'utf8', (err, result1) => {

//     console.log(result1);

//     fs.readFile('./2.txt', 'utf8', (err, result2) => {

//         console.log(result2);

//         fs.readFile('./3.txt', 'utf8', (err, result3) => {

//             console.log(result3);

//         });

//     });

// });

//下面是利用promise改造回调地狱的代码 解决了异步API嵌套的问题

//1.依次读取3个文件,也就是要调用三次fs.readFile(),由于fs.readFile()是异步API,所以我们可以用promise包装它

//2.为了控制API在适当的时机被执行,又在promise外面包裹一个函数 当函数被调用时return的就是这个promise对象

function p1() {

    return new Promise((resolve, reject) => {

        fs.readFile('./1.txt', 'utf8', (err, result) => {

            resolve(result)

        })

    })

}

function p2() {

    return new Promise((resolve, reject) => {

        fs.readFile('./2.txt', 'utf8', (err, result) => {

            resolve(result)

        })

    })

}

function p3() {

    return new Promise((resolve, reject) => {

        fs.readFile('./3.txt', 'utf8', (err, result) => {

            resolve(result)

        })

    })

}

//3.由于promise给我们提供了链式编程的写法,如果想要在第二个then拿到r2的结果,只需在前面一个then 返回p2()的promise对象即可

p1().then((r1) => {

        console.log(r1);

        return p2();

    })

    .then((r2) => {

        console.log(r2);

        return p3();

    })

    .then((r3) => {

        console.log(r3);

    })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值