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