2015-10-02 65 views
1

在查看JQuery延遲承諾的潛在用例時,我遇到了緩存作爲潛在用途之一。這帶來了以下問題:在使用現代瀏覽器和智能客戶端(JQuery,任何現代MVC等)時,我甚至不必擔心自己緩存什麼?我正在使用MEAN堆棧,並且我認爲緩存確實發生在默認情況下。標題中有一個Etag字段,用於確保服務器不會兩次發送相同的信息。第二次,客戶端將得到空響應主體的304代碼。那麼是否有用例需要在前端手動實現緩存?謝謝!使用JQuery推遲承諾進行緩存

+0

你可能會發現這個演示很有趣:http://www.slideshare.net/RayBellis/memoizing-withindexeddb – Alnitak

+0

你並不總是想緩存確切的服務器響應 - 通常你想要緩存部分數據,或者處理的信息。 –

回答

1

Promises的整個概念旨在簡化JavaScript程序員異步計算的處理。我可以想象一個有效的用例,當你用拒絕的承諾提供一些預定義的數據時,但這不是你所說的「緩存」。

如果您有一個延遲對象來處理對異步API的某種請求,則由您來實現靜態數據的緩存層,它可能是您的.then()函數的一部分。瀏覽器會像您在代碼中那樣向API發送儘可能多的請求,並且服務器將響應相同數量的響應,除非它具有自己的緩存層。

Here is an example使用Memoization緩存來自異步計算的數據。

// *specialized* function for, say, network requests, 
// where caching is desired. In this case, we're caching 
// promises by the URL they're fetching 
var fetch = (function() { 
    var cache = {}; 
    return function (url) { 
    cache[url] = cache.hasOwnProperty(url) ? cache[url] : new Promise(
     /* request magic goes here */ 
    ); 
    return cache[url]; 
    }; 
}); 

TL:DR

你不使用承諾緩存,你實現你自己的緩存層爲您的異步計算(可以使用該記憶化模式)。如果您使用Deferred對象作爲常規回調,則無關緊要。