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的差異沒有什麼關係。