2014-02-23 42 views
0

我有一個屏幕設計,其中我需要緩存AJAX JSON響應,以便我可以使用相同的數據進一步請求。屏幕設計顯示支付的歷史數據,其中用戶可以操縱日期範圍。所以,最初的調用將我回收了過去10年的整個數據。後來當用戶修改日期範圍時,我希望通過緩存數據進行處理。通過全局變量緩存jQuery AJAX JSON響應

我不打算使用客戶端存儲,因爲它們不太安全。相反,我想檢查是否可以使用全局變量在第一次調用之後存儲JSON響應,然後爲後續的連續調用,我可以從全局變量中獲取數據,而不是從另一個服務器調用中獲取數據。

//check whether the global variable is null or not 
if($pymntHistData == null) 
    { 
    $.ajax({ 
        type: 'POST', 
        dataType: 'JSON', 
        url: 'PaymentHistory/_PaymentHistoryPartial', 
        data: { 
         fromDate: fromDate, 
         toDate: toDate 
        }, 
        success: function(data) { 
        //store the response data in a global variable 
        $pymntHistData = data; 
        } 
    } 

建議使用全局變量進行緩存作爲緩存的替代方法之一?還是對此方法有任何疑慮?

+0

當然你也可以做到這一點。但是,我不會使用全局變量,但會隱藏返回承諾的API背後的提取邏輯。這使你的代碼更加靈活。更多信息:http://learn.jquery.com/code-organization/deferreds/ –

+0

@FelixKling當一些請求需要很長時間才能繼續進行時,通常會使用Arent延遲,除了完全阻止它之外,我們會發送一些請求。我想知道延遲是如何適合隱藏提取邏輯的。 –

+0

我添加了一個例子作爲答案。無論請求需要多長時間,承諾都是構建代碼的一種方式。無論您是在進行異步函數調用還是在後面進行同步函數調用都無關緊要。承諾讓你從實際的實現中抽象出來。 –

回答

0

您可以這樣做,但更好的方法是使用promise並隱藏函數後面的數據。然後,該功能可以緩存

照顧想象把你的Ajax調用的函數getData,它返回一個承諾:

var getData = function() { 
    return $.ajax(...); 
}; 

然後,您可以調用該函數與

getData().then(function(data) { 
    /* do something with data */ 
}); 

和回調完全不知道數據是從服務器實際獲取的,還是從其他地方獲取的。

所以現在我們可以改變的getData的實施不影響調用者和實現緩存:

var getData = (function() { 
    var cache; 

    return function() { 
     if (cache) { 
      return (new $.Deferred()).resolve(cache).promise(); 
     } 
     return $.ajax(...).then(function(response) { 
      cache = response; 
     }); 
    }; 
}());