Node.js 之 Promise 学习

在Node.js里有时候回因为回调函数调用过多,导致回掉地狱。 而使用Promise可以避免这个问题。

Promise概念:
Promise是ES6中新出现的一个东西,在ES6中就是一个对象。
Promise常常是一个容器,一般用来封装一个异步操作。

Promise使用:
1.Promise 对象有三种状态:Pending(正在处理),Resolved(成交,已解决),Rejected( 驳回,失败)。需要注意的是Promise对象一经创建,立刻执行。

2.Promise实例对象有一个方法:then 方法。
1) then需要传递两个回调处理函数:
其中第一个回调处理函数就是promise对象内部的resolve函数;
第二个回调函数是可选的,如果传递就是promise对象内部的reject函数;
2)then 方法后可以继续链式调用then:
后续的每一个then中指定的回调函数都会被执行;
后续的then中指定的回掉函数可以接收上一个then中指定的成功的回调函数的返回结果:
a.没有返回值,默认是undefined
b.有普通的返回指,数字,字符串,对象,数组。。。
c.返回一个新的promise对象

3.Promise的异常处理:
在使用promise做异步处理的时候,关于异常的处理可以通过在最后一个then之后设置一个catch,然后指定一个失败处理函数。该函数可以捕获前面所有的promise对象本身一件then内部的任务错误。当前面任何一个发生异常,直接进如catch,后续所有的promise包括then不再执行。

Example #1:

const fs = require('fs');
new Promise((resolve, reject) => {
    fs.readFile('./data/1.txt', (err, data) => {
        if(err){
            //当 promise对象内部的异步操作失败,告诉promise的对象容器,该异步任务失败了,其实就是将promise内部的pending改为rejected
            reject(err);
        }

    //当代码执行到这里,说明该promise对象的内部的异步操作没有错误发生,证明成功了
    //然后将promise的内部的pending状态改为resolved
    resolve(data);
    console.log("Here!");
    })
})
.then((data) =>{
    console.log("111");
    console.log(data.toString());
    return new Promise((resolve, reject) => {
        fs.readFile('./data/2.txt', (err,data) => {
            //这里没有使用return的原因是promise的状态只能从pending变为resolved 活着rejected, 状态一旦改变不会发生变话
            if(err)
                reject(err);

            resolve(data);
        })
        });
},(err)=>{
    console.log("Failed to read the file!");
})
.then((data)=>{
    console.log("222");
    console.log(data.toString());
    return new Promise((resolve, reject) => {
        fs.readFile('./data/3.txt', (err,data) => {
        //这里没有使用return的原因是promise的状态只能从pending变为resolved 活着rejected, 状态一旦改变不会发生变话
        if(err)
        reject(err);
       resolve(data);
})
});
})
.then((data)=>{
    console.log("333");
   console.log(data.toString());
})

Example #2:

const fs = require('fs');

readFile('./data/1.txt', 'utf8')
    .then(data => {
        console.log(data);
        return readFile('./data/2.txt', 'utf8');
     })
    .then(data => {
        console.log(data);
        return readFile('./data/3.txt', 'utf8');
     })
    .then(data => {
     console.log(data);
     })
     
function readFile(...args) {
    return new Promise((resolve, reject) => {
        fs.readFile(...args, (err, data) =>{
        if (err)
            reject(err);

        resolve(data);
     })
  })
}

Example #3:

const fs = require('fs');

readFile('./data/1.txt', 'utf8')
    .then(data => {
     console.log(data);
     return readFile('./data/12.txt', 'utf8');
})
.then(data => {
    console.log(data);
    JSON.parse('ss');
   return readFile('./data/3.txt', 'utf8');
})
.then(data => {
    console.log(data);
})
.catch(err => {
    console.log(err);
})


function readFile(...args) {
    return new Promise((resolve, reject) => {
        fs.readFile(...args, (err, data) =>{
        if (err)
            reject(err);

        resolve(data);
    })
})
}

From: BiliBili 《node-全栈项目》17,18,19,21集

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值