1. 程式人生 > >async/await ,Blurbird Promise,原生Promise學習小結。

async/await ,Blurbird Promise,原生Promise學習小結。

 

最近在研究node+koa構建服務端,在資料庫方面我選擇了sequelize。於是乎就碰到了個問題,sequelize文件說它是使用Bluebird Promise來控制流程。那麼Bluebird Promise和原生Promise 有什麼差別呢?在使用async/await進行非同步執行的時候會有什麼不同的影響嗎?帶著這些問題,我開始了為期一個下午加一個早上的摸索。

首先我先想測試下Bluebird Promise 和 原生Promise執行有什麼差別,於是我使用sequelize來獲取bluebird的promise

     const bluePromise = require('bluebird');

     let bP = new bluePromise((r)=>{r(8)}); // 返回的是Bluebird Promise物件
     bP.then(r=>{
            console.log("bluebird: "+r);
        });


    new Promise(resolve=>{resolve(192)})  // 原生Promise物件
        .then(r=>{
            console.log("native promise: "+r);

        })
        
    console.log("end");

看到這段程式碼,如果Bluebird Promise與原生Promise沒差別那麼列印順序應該是 end   bluebird:8   native promise:192,

可是實際結果是 end native promise : 192   bluebird:8

沒錯,Bluebird的then操作在原生promise的後面。通過我查閱帖子瞭解到,Bluebird的then操作放在巨集任務佇列,而原生Promise屬於微任務佇列,所以這就好理解了。

 

接下里看 await 後面跟著這兩種Promise物件的時候會有什麼差異呢?

根據ECS文件上說 await 後若為promise物件,它會等待promise返回值後再繼續執行下面的程式碼。

const bluePromise = require('bluebird');
const test = async ()=>{

     let bP = new bluePromise((r)=>{r(8)}); // 返回的是Bluebird Promise物件
     await bP.then(r=>{
            console.log("bluebird: "+r);
        });


     await new Promise(resolve=>{resolve(192)}) 
        .then(r=>{
            console.log("native promise: "+r);

        });

     console.log("end");
}

結果: bluebird:8   native promise:192  end

那麼證明了Blurbird Promise與原生Promise在await 關鍵字後方都被作為promise,await都會等待其執行結束返回一個值(若最後一個then沒有return值則返回undefined)後再執行下一步的程式碼。與Bluebird Promise 和原生Promise的差異沒有什麼關係。