隨着JavaScript
的快速發現,針對異步流程控制的方案也愈來愈多,如今常見主要有四種方案:es6
回調函數的異步方案是咱們最熟悉不過的了,ES5
中異步API
大多采用這種形式,拿ajax
舉例:
好比咱們但願xx2
請求發生在xx1
的請求完成以後,通常會是以下寫法:
仔細觀察不難發現這種實現方式的缺點,實現過程是一層層嵌套,若是有多個異步請求須要執行,那麼它的嵌套層次將會很深,形成回調地獄,代碼可讀性很是差。ajax
ES6
中提出的promise
語法糖對異步流程控制作了更好的封裝,他提供更加優雅的方式來管理異步任務的執行,可讓咱們以同步的方式編寫異步代碼。
promise
generator
也是es6
中新增的一種語法糖,它是一種特殊的函數,能夠被用來作異步流程管理。
在上述示例中咱們定義了ajaxManage
這個generator
函數,可是當咱們調用該函數時他並無真正的執行其內部邏輯,而是會返回一個迭代器對象,generator
函數的執行與普通函數不一樣,只有調用迭代器對象的next
方法時纔會去真正執行咱們在函數體內編寫的業務邏輯,且next
方法的調用只會執行單個經過yield
或return
關鍵字所定義的狀態,該方法的返回值是一個含有value
以及done
這兩個屬性的對象,value
屬性值爲當前狀態值,done
屬性值爲false
表示當前不是最終狀態。咱們能夠經過將異步任務定義爲多個狀態的方式,用generator
函數的迭代器機制去管理這些異步任務的執行。這種方式雖然也是一種異步流程控制的解決方案,可是其缺陷在於咱們須要手動管理generator
函數的迭代器執行,若是咱們須要控制的異步任務數量衆多,那麼咱們就須要屢次調用next
方法,這顯然也是一種不太好的開發體驗。異步
async/await
是es8
中引入的一種處理異步流程控制的方案,它是generator
函數的語法糖,可使異步操做更加簡潔方便。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函數