Promise對象的基本使用

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

發佈了189 篇原創文章 · 獲贊 64 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章