談談Javascript異步編程以及新的實現方法--Promise

    最近看到好多文章都在講Promise,爲何如今異步編程會受到如此重視?又爲何異步編程要選擇Promise呢?javascript

    先來講說第一個問題,異步編程能受到如此重視很大緣由是由於javascript正在逐漸走向標準化、規範化(MVC,模塊,OOP),因此一些傳統編程領域的規範化約束髮揮的做用也愈來愈大了,並且javascript自己就是圍繞"異步"來進行的,不管是瀏覽器端仍是node服務器端,大多數的API都是經過"事件"來將請求和返回值分離的。簡單來講:javascript受到了重視了,而它自己呢異步編程偏多.java

    接下來即是第二個問題,異步編程爲何要選擇promise呢?上面說到了"事件",講到"事件"是必定離不開回調的。而回調呢,做爲傳統的實現異步編程有三大方法(回調、事件監聽、發佈/訂閱)之一,實現起來是不太利索的,一層層的回調嵌套足夠讓你陷入"回調地獄",大大下降了程序邏輯的可讀性。因此這時候,Promise救世主(先知)出現了,Promise是CommonJS工做組規範制定出來的一種機制,爲了給異步編程提供統一的接口,實現規範化的異步編程管理,並且when/then的鏈式寫法讓流程清晰明瞭.它的做用場景主要是用於耗時的場景(在node中問題比較凸顯,由於node自己就是異步編程驅動的),好比與後臺交互的AJAX、Socket以及某一模塊存在大量回調嵌套時node

    簡單介紹以後呢,咱們來看看它的工做流程(圖) Promise返回狀態 -- > then接收狀態,並使用回調處理相應狀態編程

     

    Promise爲實例對象,該對象接收一個或者多個參數請求(多個請求時使用when(f1,f2)),最終返回的是一個有限狀態機,擁有如下狀態:promise

  • 完成(resolve)
  • 否認(rejected)
  • 等待(pending)

    返回狀態後then(onResolve,onReject)對相應的狀態作出相應的onXXX回調處理,then(onResolve,onReject)是個鏈式方法,讓使用者分別處理成功失敗.瀏覽器

    有一個Deffered對象(到目前爲止,我對Deffered的認識仍是模模糊糊的)服務器

  • 提供resolve和rejected方法,來完成一個Promise

   最後列出支持Promise的經常使用框架:瀏覽器自帶new Promise APIjQuery裏的$.deferred() AngularJs 裏的$q.defer()、dojo裏的Promise抽象基類以及服務器端node上的Promise庫框架

   或者能夠本身搭建實現一個Promise框架.異步

相關文章
相關標籤/搜索