什麼是promise?爲何要在nodejs中使用promise?使用promise到底有什麼好處呢?實在太多了,一一說來不如直接上實戰。咱們先介紹一下nodejs中的promise的一些調用.再結合promise的應用逐步深刻。node
Promise.then Promise.catch Promise.resolve Promise.reject Promise.all Promise.race
這就是一些簡單的Promise的調用看起來很少,可是靠這個真得解決了許多必須同步並行的環境.promise
demo1
Promise自己是一個對象在nodejs 4.x開始支持。建立一個Promise對象很簡單,主要是分兩步函數
var promise = new Promise((resolve,reject)=>{ var data = [1,2,3] if(data.length > 3) resolve(data) else reject(new Error("array length invalid")) })
這就是一個很是基礎的東西,resolve意味着成功解決,而reject意味着拒絕。可是如何繼續進行之後的事情,對事情的結果如何處理呢?這就是涉及到了Promise.then 這個東西意味着而後。Promise.then(resolveHandler,rejectHandler)存在兩個回調函數根據我的的需求進行處理。spa
promise.then(res => { console.log(res) }, err => { console.error(err) })
這兩個的順序是固定的,即便你處理的東西不須要res,你也必須用這樣的形式來正確表達code
promise.then(null, err => { console.error(err) })
來讓promise理解你不須要resolve的handler
你們能夠根據代碼看看咱們得到的東西到底是什麼,理解下res,err究竟是什麼,再看看接下來的東西對象
其實res就是當Promise的狀態爲resolve下所返回的數據,而err則是Promise的狀態爲reject狀況下所返回的異常。用官方來說的話就是promise.then(onFulfilled, onRejected)。可是說實話咱們在用then的時候咱們對於onRejected是很是少的,由於它存在一些問題,致使咱們都是用Promise.catch()來捕獲在前階段中出現的異常的。blog
接下來就是Promise.catch()的一些簡單用法事件
Promise.catch(err)主要存在一個回調正如咱們看到的它的函數體得到了一個err參數,也能夠向前面這麼理解把就是Promise.catch(errorHandler)就是錯誤處理函數。如下是它的用法圖片
promise.then(res => { console.log(res) }).catch(err => { console.log(err) })
那麼咱們到底的一個具體的過程到底是什麼樣子的呢?這時候咱們用簡單的一張圖來表示咱們對當前的函數處理的一個過程的描述回調函數
從順序上來講不難看出,咱們的Promise.catch自己就在咱們的Promise.then()以後,通常都是就算不是在這以後也是放在最後進行捕獲的,它不只僅能夠捕獲咱們在resolveHandler中處理函數遇到的異常,同時還能處理咱們在rejectHandler中遇到的異常,因此很是游泳,如何你不寫rejectHandler他同樣能直接捕獲咱們前一步的異常,也就是直接從Promise對象中reject過來的過程,意味着它是直接捕獲異常的,在catch前面的全部異常都會被他捕獲,咱們能夠把他想象成一個很大的try catch 塊來對異常進行處理,因此和咱們在rejectHandler中能處理能作的,咱們的catch都更勝一籌!因此咱們大體都是用catch來處理整個Promise中可能產生的異常。如下是catch的直接捕獲異常圖
而後是咱們的Promise.resolve和Promise.reject調用的一些簡單例子啊
demo2
Promise.resolve("resolve").then(res=>{ console.log(res) }) Promise.reject("error").catch(err=>{ console.error(err) })
這邊的意思的話,你們可能不難看出咱們的Promise.resolve和Promise.reject 相似一個Promise對象的工廠,能夠主觀地生成一個已經resolve或是reject的Promise對象,從而咱們能夠在這個對象的基礎上進行操做。並且這是一個靜態的方法,能夠隨時隨地幫助咱們應用Promise,這兩個調用的方法挺簡單的。
接下來是咱們的多重then,catch的使用,咱們都知道咱們在then和catch中對應的回調函數都是有對應的參數的,而在一個存在Promise的函數咱們所能得到的參數必然是這樣的經過resolve或是reject傳過來的,那麼還有沒有不適用resolve或是reject就能得到參數的方法?這是確定有的!
咱們在then(handler)中返回一個數值,請注意,這時候經過咱們的then返回
Promise.resolve(1) .then(res=>{ return res+1 }) .then(res=>{ console.log(res) }) .catch(err=>{ console.error(err) }) 最後咱們獲得即是2,並且這個then能夠很是的長,每當咱們完成一個事件的時候,它會接着往下走,直到then的終點,或中間被catch了。一樣的,若是咱們在errhandler中返回了值,那麼你以爲會是怎麼樣? Promise.reject(1) .then(res=>{ return res+3 },err=>{ return err+1 }) .then(res=>{ console.log(res) }) .catch(err=>{ console.error(err + 1) }) 結果仍是2,爲何呢?由於只要你經過return返回一個值的話,你所得到的,都是一個resovle的狀態的Promise,要解決這個問題,你就只能拋異常,讓catch來捕獲了 把errorhandler 的回調函數改爲 throw new Error(err)那麼打印出來的將會大有不一樣! 並且比較有趣的是咱們的catch和then都是能夠混搭的,如下狀況也是能繼續跑的 Promise.resolve(1) .then(res=>{ return res+1 },err=>{ return err+1 }) .then(res=>{ console.log(res) }) .catch(err=>{ return err+1 }).then(res=>{ //由於拿到一個返回值了,因此咱們後面的then又能繼續進行 console.log(res) })