jquery 中的deferred和promise 實踐

介紹jquery 的deferred由來

它是jquery1.5版本的新出的功能,為了解決異步回調(diào)的問題。大概2011年就出來了。現(xiàn)在es6規(guī)范中的promise,基本和deferred對象是一個概念。

定義deferred對象

   var deferred1 = $.Deferred();//這樣就創(chuàng)建了一個deferred對象
   deferred.done(sucessfn);     //定義d1成功后的回調(diào)函數(shù)
   deferred.fail(failfn);              //定義d1失敗后的回調(diào)函數(shù)

每一個deferred對象,有三種狀態(tài)

  1. 正在處理中:
  2. 成功狀態(tài):
  3. 失敗狀態(tài):

當(dāng)deferred對象被resolve/reject觸發(fā)之后,就會改變狀態(tài),然后調(diào)用不同狀態(tài)下的函數(shù)。

    //從正在處理的狀態(tài)變?yōu)槌晒顟B(tài),callback done,
    deferred1.resolve(); 
   //從正在處理的狀態(tài)變?yōu)槭顟B(tài),callback fail,
  deferred1.reject();

以上就是deferred的基本用法,簡單說來。就是可以讓我們認(rèn)為控制一個對象成功失敗的狀態(tài)。看到這里,好像沒覺得它有多牛逼。

deferred對象解決了什么問題?~~

1.ajax對象,易讀性

  • jquery1.5版本重寫了$.ajax對象,$.ajax的返回值全是deferred對象。用done和fail來表示成功或者失敗。

      var deferred2 = $.ajax("test.html")
                       .done(function(){ alert("哈哈,成功了!"); })
                       .fail(function(){ alert("出錯啦!"); });
    
  • 為一個deferred對象,添加多個回調(diào)處理函數(shù),且按照添加的順序執(zhí)行

      deferred2.done(sucessfn 1) 
               .done(sucessfn 2)
    
  • 解決異步金字塔回調(diào) $.when()
    想想這樣的業(yè)務(wù)場景,有三個及以上異步請求的時候,如何保證3個請求都成功之后,在執(zhí)行一個函數(shù)呢?

      $.ajax({
            success: $.ajax({})   //只能通過回調(diào)成功的函數(shù)里,嵌套ajax請求
      })
      
      //通過計數(shù)器來實現(xiàn),但是每個回調(diào)成功的函數(shù),都要檢查當(dāng)前的計數(shù)
      var flag = 0;
      $.ajax({
            success: flag++  
                     if(flag == 3){
                              //3個請求已成功
                     }
      })
     //只有當(dāng)兩個ajax都成功的時候,才調(diào)用done的回調(diào)函數(shù)。
      $.when($.ajax1,$.ajax2)
       .done(f1)
       .fail(f2)
    

特別注意:when函數(shù),只接受deferred對象哦!!!!

  • 簡單寫法 then方法,直接把done狀態(tài)和fail狀態(tài)都寫進(jìn)去

      deferred1.then(donefunc,failfunc);
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Promise 的含義 一句話概括一下promise的作用:可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套...
    雪萌萌萌閱讀 5,542評論 0 7
  • 一、什么是deferred對象? 開發(fā)網(wǎng)站的過程中,我們經(jīng)常遇到某些耗時很長的javascript操作。其中,既有...
    壯哉我大前端閱讀 263評論 0 1
  • 請移步: https://blog.cdswyda.com/post/20160923
    依韻宵音閱讀 401評論 0 6
  • 迎著蒼黃的落日,炮聲響徹在天空。像一顆顆尖銳的子彈,向天空的心臟開上了一槍又一槍。我本以為柔弱的天空會千瘡百孔,...
    孔子顏淵閱讀 911評論 17 8
  • 格式塔心理學(xué)(gestalt psychology),又叫完形心理學(xué),是西方現(xiàn)代心理學(xué)的主要學(xué)派之一,誕生于德國,...
    暖陽_1332閱讀 1,606評論 0 2