2014-12-23 20 views
1

我有sendRequest將對象和類有像要讓jQuery跟jqxhr像已經發送請求

 request: function(args) 
     { 
      return $.ajax.apply(null, args); 
     }; 

一個函數,那麼很多類使用sendRequest將對象來獲取服務器響應

 var prom = SendRequest.request(
      { 
       type: 'GET', 
       url: _this.uri 
      }); 

     return $.when(prom).done(function(response) 
      { 
       .... do something 
      }); 

我的目標在SendRequest.request中需要首先檢查window.localStorage。 是否已有值,如果之前沒有任何值則發送請求。 否則,如果在localStorage上已經有值,那麼返回具有該保存值的$ .ajax()對象。

 request: function(args) 
     { 
      var ls = window.localStorage; 
      var savedResponse = ls.getItem(args.url); 
      if (savedResponse !=== null) 
      { 
       var result = $.ajax(); 
       result.responseText = savedResponse; 
       result.readyState = 4; 
       result.status = 'OK'; 
       return result; 
      } 
      else 
      { 
       return $.ajax.apply(null, args); 
      } 
     }; 

但遺憾的是它沒有工作:( 我一直在尋找,但找不到像我這樣的一些情況

我已經這樣嘗試 how to fool jqXHR to succeed always ,但它不是太大的幫助

+0

關閉,選民 - 恕我直言,這個問題是完全清楚。 – Alnitak

回答

1

這不起作用的原因是,儘管您創建了一個僞造jqXHR對象,即$.ajax的響應,但該對象實際上並不是提供給.done回調的參數 - 它實際上是th第三個參數。

此外,恕我直言,你不應該真的使用$.when來「promisify」一個單一的非承諾對象。它旨在處理多個承諾之間的同步,以及將每個非承諾包裝爲新承諾的事實只是一個副作用。

相反,您應該創建一個新的承諾,已經是「解決」用適當的數據:

if (savedResponse != null) { 
    return $.Deferred(function() { 
     // retrieve relevant fields from localStorage 
     ... 
     this.resolve([data, textStatus, jqXHR]); 
    }).promise(); 
} else { 
    // perform real AJAX request 
    return $.ajax.apply($, args); 
} 

或者,只考慮memoizing返回數據本身(成功的呼叫),而不是整個響應三重。

您也可能會發現這個演講,我在使用jQuery的英國2013了 - http://www.slideshare.net/RayBellis/memoizing-withindexeddb

+0

謝謝@r @ Alnitak先生幫助我這麼多:) – leuza