परीक्षण (भंडारण कोटा से अधिक) के दौरान आज इसमें भाग लिया और एक समाधान को मार दिया। आईएमओ, यह जानते हुए कि सीमा क्या है और हम कहां संबंध में हैं, कोटा से परे भंडारण जारी रखने के लिए एक कार्यात्मक तरीका लागू करने की तुलना में बहुत कम मूल्यवान है।
इस प्रकार, आकार की तुलना और क्षमता जांच करने की कोशिश करने के बजाय, जब हम कोटा से टकराते हैं तो प्रतिक्रिया देते हैं, हमारे वर्तमान भंडारण को एक तिहाई कम करते हैं, और भंडारण फिर से शुरू करते हैं। यदि कहा जाए कि कमी विफल हो जाती है, तो भंडारण बंद कर दें।
set: function( param, val ) {
try{
localStorage.setItem( param, typeof value == 'object' ? JSON.stringify(value) : value )
localStorage.setItem( 'lastStore', new Date().getTime() )
}
catch(e){
if( e.code === 22 ){
console.log('Local storage capacity reached.')
var maxLength = localStorage.length
, reduceBy = ~~(maxLength / 3);
for( var i = 0; i < reduceBy; i++ ){
if( localStorage.key(0) ){
localStorage.removeItem( localStorage.key(0) );
}
else break;
}
if( localStorage.length < maxLength ){
console.log('Cache data reduced to fit new entries. (' + maxLength + ' => ' + localStorage.length + ')');
public.set( param, value );
}
else {
console.log('Could not reduce cache size. Removing session cache setting from this instance.');
public.set = function(){}
}
}
}
}
यह फ़ंक्शन एक आवरण ऑब्जेक्ट के भीतर रहता है, इसलिए public.set केवल खुद को कॉल करता है। अब हम भंडारण में जोड़ सकते हैं और चिंता नहीं कर सकते कि कोटा क्या है या हम कितने करीब हैं। यदि कोई एकल स्टोर 1 / 3rd से अधिक है, तो कोटा आकार वह है जहाँ यह कार्य बंद हो जाएगा और भंडारण छोड़ दिया जाएगा, और उस बिंदु पर, आपको वैसे भी कैशिंग नहीं करना चाहिए?