promise对象用于将node.js中的异步函数串行执行,串行执行的情况可以分为以下两种情况:
串联
使用then方法,每次返回promise对象或其他参数。
let startTime = Date.now();
function fun1() {
let err = null;
let start = Date.now()-startTime;
return new Promise((resolve,reject)=>{
setTimeout(()=>{
if(err){
reject(err);
}else{
resolve(`fun1 start:${start}\tend:${Date.now()-startTime}`);
}
},2000)
})
}
function fun2() {
let err = null;
let start = Date.now()-startTime;
return new Promise((resolve,reject)=>{
setTimeout(()=>{
if(err){
reject(err);
}else{
resolve(`fun2 start:${start}\tend:${Date.now()-startTime}`);
}
},1000)
})
}
fun1()
.then((data)=>{
console.log(data);
return fun2();
})
.then((data)=>{
console.log(data);
console.log(`fun3 start:${Date.now()-startTime}`);
});
输出结果
un1 start:0 end:2005
fun2 start:2029 end:3033
fun3 start:3035
通过输出结果可以看出,fun2是在fun1执行完成之后,fun3则是在fun2之后完成的,fun3开始执行的时间=fun1+fun2的执行时间。这种情况对应的适用场景例如,fun1从数据库抓取数据,fun2对数据进行整理,fun3将后端数据传递给前端模板。
并联+串联
使用Promise.all方法
Promise.all([fun1(),fun2()])
.then((data)=>{
for(let item of data){
console.log(item);
}
console.log(`fun3 start:${Date.now()-startTime}`);
})
输出结果:
fun1 start:0 end:2006
fun2 start:1 end:1005
fun3 start:2028
Promise.all适用于,在某几个异步函数执行完毕之后,再进行执行。
如上面代码所示,fun3是需要在fun1和fun2完成之后再执行的,并不关心fun1和fun2执行的先后顺序。
由于fun1执行需要2000ms,fun2需要1000ms,fun1和fun2同时执行,fun2先执行完,fun1后执行完。fun3开始执行时间=max(fun1执行时间,fun2执行时间)。
参考链接:
ES6中的Promise对象:http://es6.ruanyifeng.com/#docs/promise
bludbird参考文档:http://bluebirdjs.com/docs/api-reference.html