之前一直就知道有promise这么一个东西,但具体怎么用却不清楚(es6的大怀抱),直到最近在写个人的后端程序时候,才体会到promise的好处。
首先谈一下具体使用的业务场景(这里不拿ajax举例子了。。。)拿数据库举例,比如我想根据一条id返回一整条数据,具体代码应该是如下:
con.query(sql, id, function(err, data){
if(err){
throw new Error("error");
}
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){
}, 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(){
}, function(){
});
还有Promise.race方法,代表竞速,即数组中的第一个Promise被resolve(reject)的时候,就进入then。
个人的学习,仅供参考,如有错误请指正~(手动笔芯)