2011-05-18 19 views
5

में समकालिक रूप से कैश का प्रबंधन करना मैं वैश्विक कैश चर में jquery का उपयोग कर जावास्क्रिप्ट में कैश बनाए रख रहा हूं।जेएस

जब भी AJAX का उपयोग करके नई जानकारी प्राप्त की जाती है तो इसे कैश में जोड़ा जाता है।

यदि यह कैश में नहीं है, तो मैं इसे सर्वर से AJAX करना चाहता हूं।

मैं मांग पर क्वेरी करने के लिए और इतने की तरह उपयोग करने के लिए एक समारोह लागू करना चाहते हैं:

$("#label").html(GetName("user123")); 

कहाँ getName() की तरह होना चाहिए:

function GetName(username) { 
    if (Cache[username] != null) return Cache[username]; 
    else 
    return QueryUsernameFromServer(username) 
} 

QueryUsernameFromServer() की तरह होना चाहिए:

function QueryUsernameFromServer (username) { 
    return $.ajax(…); 
} 

हालांकि, $ .ajax async है जिसका अर्थ है कि यह किसी मान की प्रतीक्षा नहीं कर सकता (और इस प्रकार वापस नहीं आ सकता यह)।

सिंक मोड में $ .ajax का उपयोग करते हुए सुझाव दिया जाता है नहीं (ब्राउज़र रुक जाता है और यह JSONP का समर्थन नहीं करता), http://api.jquery.com/jQuery.ajax/

का उपयोग करते हुए इस, http://www.techfounder.net/2008/05/17/simple-javascript-cache/, दृष्टिकोण एक कॉलबैक की आवश्यकता है। हालांकि, प्रत्येक उपयोग के लिए कॉलबैक बनाना वांछित नहीं है।

क्या प्रत्येक उपयोग के लिए समर्पित कॉलबैक के बिना जेएस और AJAX में "कैश ऑन डिमांड" फ़ंक्शन को लागू करने का कोई अच्छा तरीका है?

उत्तर

5

आपको कॉलबैक होना होगा, क्योंकि AJAX है ... इसके लिए प्रतीक्षा करें ... "ए" तुल्यकालिक।

कैश से पूछताछ करने वाले अपने कार्यों में बस एक कॉलबैक जोड़ें। यह बहुत सरल है:

function getName(username, callback){ 
    if(cache[username]){ 
    // cache hit, immediately invoke the callback 
    callback(cache[username]); 
    }else{ 
    // assumes this query function updates the cache and invokes the 
    // 2nd parameter when it completes 
    queryUsernameFromServer(username, function(){ 
     // invoke the callback now 
     callback(cache[username]); 
    }); 
    } 
} 

और बस अपने कोड में एक async शैली में बदलने का:

से पहले:

var name = getName('jvenema'); 

के बाद:

getName('jvenema', function(name){ 

}); 
+0

+1 इस प्रकार deferreds का उपयोग करें। यह _exactly_ है जो मैंने काम पर हमारे डेटा प्रदाता के लिए उपयोग किया था। मुझे डेटा लेयर होना पसंद है ताकि हम इसका पुन: उपयोग कर सकें और सभी 'AJAX' कोड को एक स्थान पर अपडेट कर सकें (उदा। जब jQuery ने अपने 'AJAX' नामस्थान को ओवरहाल किया)। – pixelbobby

1

यदि आपका jQuery का उपयोग कर 1.5+ तो आप केवल deferreds का उपयोग कर सकते हैं।

function GetName(username) { 
    if (Cache[username] != null) return $.when(Cache[username]); 
    else 
    return QueryUsernameFromServer(username) 
} 

और के रूप में अच्छा समाधान के लिए

GetName('jvenema').done(function(name) { 

});