Q026:如何解決異步調用回調地獄問題

1.什麼是異步調用:
不論是瀏覽器中最爲常見的ajax、事件監聽、還是node中文件讀取、網絡編程、數據庫等操作,都離不開異步編程。在異步編程中,許多操作都會放在回調函數中,同步與異步的混雜,許多的回調嵌套都會使代碼變得難以理解與維護。
每增加一個異步請求,就會多添加一層回調函數的嵌套,多個回調就陷入了“回調地獄”。
2.避免回調地獄的方法
(1)拆解function
回調嵌套所帶來的一個重要問題就是代碼不容易閱讀與維護,基於這一點,將各步拆解爲單個的function,該方法非常簡單,但是缺少通用性。
(2)事件發佈/監聽模式
(3)promise
promise是一種異步解決方法,最早由社區提出並實現,後來寫進了es6規範。
目前一些主流的瀏覽器已經原生實現了promise的API,可以在Can I use裏查看瀏覽器的支持情況。當然,如果想要做瀏覽器的兼容,可以考慮使用一些promise的實現庫,例如bluebird、Q等。
promise將之前的嵌套操作編程通過then連接的鏈式操作,代碼的整潔度上有較大的提高。
(4)generator
(5)async/await
可以看到,上面的方法雖然都在一定程度上解決了異步編程中回調帶來的問題。然而
function拆分的方式其實僅僅只是拆分代碼塊,時常會不利於後續維護;
事件發佈/監聽方式模糊了異步方法之間的流程關係;
Promise雖然使得多個嵌套的異步調用能夠通過鏈式的API進行操作,但是過多的then也增加了代碼的冗餘,也對閱讀代碼中各階段的異步任務產生了一定干擾;
通過generator雖然能提供較好的語法結構,但是畢竟generator與yield的語境用在這裏多少還有些不太貼切。
es7中的async/await。

後記
異步編程作爲JavaScript中的一部分,具有非常重要的位置,它幫助我們避免同步代碼帶來的線程阻塞的同時,也爲編碼與閱讀帶來了一定的困難。過多的回調嵌套很容易會讓我們陷入“回調地獄”中,使代碼變成一團亂麻。爲了解決“回調地獄”,我們可以使用文中所述的這五種常用方法:

  • function拆解
  • 事件發佈/訂閱模式
  • Promise
  • Generator
  • async / await
    理解各類方法的原理與實現方式,瞭解其中利弊,可以幫助我們更好得進行異步編程

參考文章:https://www.jianshu.com/p/bc7b8d542dcd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章