Promise的理解

2019-07-14 02:17发布

    之前一直就知道有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。 个人的学习,仅供参考,如有错误请指正~(手动笔芯)