相信不少人剛接觸promise都會暈,但學會後卻離不開它,本文詳細介紹一下promise,promise解決的問題,幫助新手快速上手html
【掃盲】node
什麼是promise?設計模式
promise是一種約定,並不是一種技術,像設計模式同樣,跟語言無關、框架無關。js裏面實現promise的框架有不少,如:Q、jQuery等。promise
promise有什麼用?框架
它主要是爲了解決js異步回調時業務太亂,尤爲嵌套異步時,代碼也很醜,維護性也差,錯誤處理也不能統一這些問題。所以目前也只有js語言會使用promise異步
【案例】spa
傳統JS異步請求是這樣的:設計
這是一個標準的異步處理方法(回調類型)3d
當有兩層時:htm
這時代碼就有些難讀了,固然平時在使用中大多數是超過兩層的:
問題1:維護困難
當出現多層的時候,代碼已經亂的看不下去了,若是業務再複雜一點幾乎無法維護了,這個時候若是需求變動,須要更換異步請求的調用順序,若是遇到這樣的代碼,簡直要崩潰
問題2:重複錯誤處理
另外裏面寫了多處錯誤處理的代碼,每個回調都要處理一次錯誤,顯然代碼太臃腫,還容易出錯。
問題3:並行處理
若是以上異步操做忽然要改爲並行處理,而且要捕獲到所有處理完事件,那麼就要把代碼拉平,還要給計數器來判斷異步是否所有返回
【解決方案】
看看promise是怎麼優雅的解決以上問題的
假設a、b、c、d4個方法都返回promise對象,以上代碼將會變爲:
這時代碼由橫向變成了縱向,好看不少。並且錯誤統一在最後面處理(任何一個分支出錯都會走catch)很是方便
另外若是上一個then返回了數據,下一個then會接收到上一個then返回的數據,如:
then分支能夠返回promise也能夠返回數據:
並行的狀況:
如須要並行處理須要用all方法:
這是的Promise是指實現Promise的框架,若是用的Q就是Q.all,原生的是Promise.all
這就實現了並行處理
這是promise的基本用法,更多功能待你們本身研究
關於nodeJS中Q的用法能夠查看個人另外一篇文章: