異步流程控制

隨着JavaScript的快速發現,針對異步流程控制的方案也愈來愈多,如今常見主要有四種方案:es6

一、callback

回調函數的異步方案是咱們最熟悉不過的了,ES5中異步API大多采用這種形式,拿ajax舉例:
好比咱們但願xx2請求發生在xx1的請求完成以後,通常會是以下寫法:
image.png
仔細觀察不難發現這種實現方式的缺點,實現過程是一層層嵌套,若是有多個異步請求須要執行,那麼它的嵌套層次將會很深,形成回調地獄,代碼可讀性很是差。ajax

二、promise

ES6中提出的promise語法糖對異步流程控制作了更好的封裝,他提供更加優雅的方式來管理異步任務的執行,可讓咱們以同步的方式編寫異步代碼。
image.pngpromise

三、generator

generator也是es6中新增的一種語法糖,它是一種特殊的函數,能夠被用來作異步流程管理。
image.png
在上述示例中咱們定義了ajaxManage這個generator函數,可是當咱們調用該函數時他並無真正的執行其內部邏輯,而是會返回一個迭代器對象,generator函數的執行與普通函數不一樣,只有調用迭代器對象的next方法時纔會去真正執行咱們在函數體內編寫的業務邏輯,且next方法的調用只會執行單個經過yieldreturn關鍵字所定義的狀態,該方法的返回值是一個含有value以及done這兩個屬性的對象,value屬性值爲當前狀態值,done屬性值爲false表示當前不是最終狀態。咱們能夠經過將異步任務定義爲多個狀態的方式,用generator函數的迭代器機制去管理這些異步任務的執行。這種方式雖然也是一種異步流程控制的解決方案,可是其缺陷在於咱們須要手動管理generator函數的迭代器執行,若是咱們須要控制的異步任務數量衆多,那麼咱們就須要屢次調用next方法,這顯然也是一種不太好的開發體驗。異步

四、async/await

async/awaites8中引入的一種處理異步流程控制的方案,它是generator函數的語法糖,可使異步操做更加簡潔方便。
image.png
async/await相比promise代碼更精簡清晰,好比多個異步任務執行時,使用promise須要寫不少的then調用,且每一個then方法中都要用一個function包裹異步任務。而async/await就不會有這個煩惱。此外,在異常處理,異步條件判斷方面,async/await均可以節省不少代碼。async

參考文章:
http://www.javashuo.com/article/p-davtkojg-h.html
https://juejin.im/entry/58a11f61128fe1005823a257函數

相關文章
相關標籤/搜索