Promise的理解

    之前一直就知道有promise这么一个东西,但具体怎么用却不清楚(es6的大怀抱),直到最近在写个人的后端程序时候,才体会到promise的好处。
    首先谈一下具体使用的业务场景(这里不拿ajax举例子了。。。)拿数据库举例,比如我想根据一条id返回一整条数据,具体代码应该是如下:

con.query(sql, id, function(err, data){
    if(err){
        throw new Error("error");
    }
    // 处理data
    res.send(data);
});

    上面的代码是不用promise的正常写法,如果处理data的地方过于冗长的话,我们只能提出一个函数(而且这个函数种不能有对con.query外部变量的处理,由于异步的原因无法保证哪个先执行),这时候如果用到Promise的话只需要按照如下的方式去写就行了:

let p = new Promise(function(resolve, reject){
    con.query(sql, id, function(err, data){
        if(err){
            reject("sql error");
        } else{
            resolve(data);
        }
    });
});
p.then(function(data){
    // resolve的函数这里处理data或者send数据
}, function(reason){
    // 异常处理
});

    这就是Promise的最基本的用法。

    我之前遇到的问题是,我要根据3个id去返回3条数据,那么我无法保证哪一条先返回,如果我套了3层:

con.query(sql1, id1, function(){
    con.query(sql2, id2, function(){
        con.query(sql3, id3, function(){
            res.send();
        });
    });
});

无疑是在浪费nodejs为我提供的良好的异步性一样…
利用3个promise很好的可以完成这一点

let p1 = new Promise(function(resolve, reject){
    // 第一条查询
});
let p2 = new Promise(function(resolve, reject){
    // 第二条查询
});
let p3 = new Promise(function(resolve, reject){
    // 第三条查询
});

    当3条查询结果全部查询完毕就是我可以执行res.send()之时。那么如何判断呢,当然不能一层套一层了,否则和没用Promise有什么区别。。。

Promise.all([p1, p2, p3]).then(function(){
    // 当所有的Promise都已经被resolve的时候执行这个方法,方法的参数是他们执行resolve参数的数据所构成的一个数组
}, function(){
    // 当有一个Promise被拒绝的时候就会执行这个方法。
});

还有Promise.race方法,代表竞速,即数组中的第一个Promise被resolve(reject)的时候,就进入then。

个人的学习,仅供参考,如有错误请指正~(手动笔芯)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值