ขอบคุณมากสำหรับทุกคนที่ทำงานเกี่ยวกับโค้ดสำหรับสิ่งนี้!
ฉันแค่อยากจะเพิ่มว่าฉันกำลังมองหาสิ่งเดียวกัน แต่ในกรณีของฉันมันมีไว้สำหรับจัดการแคชของวัตถุที่ประมวลผลเพื่อหลีกเลี่ยงการแยกวิเคราะห์และประมวลผลวัตถุจากการโทร ajax ที่อาจหรือไม่แคช โดยเบราว์เซอร์ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับวัตถุที่ต้องการการประมวลผลจำนวนมากโดยปกติแล้วสิ่งใดก็ตามที่ไม่ได้อยู่ในรูปแบบ JSON แต่อาจมีค่าใช้จ่ายสูงมากที่จะเก็บสิ่งเหล่านี้ไว้ในโครงการขนาดใหญ่หรือแอป / ส่วนขยายที่เหลืออยู่เป็นเวลานาน เวลา.
อย่างไรก็ตามฉันใช้เพื่อสิ่งที่ชอบ:
var myCache = {
cache: {},
order: [],
size: 0,
maxSize: 2 * 1024 * 1024, // 2mb
add: function(key, object) {
// Otherwise add new object
var size = this.getObjectSize(object);
if (size > this.maxSize) return; // Can't store this object
var total = this.size + size;
// Check for existing entry, as replacing it will free up space
if (typeof(this.cache[key]) !== 'undefined') {
for (var i = 0; i < this.order.length; ++i) {
var entry = this.order[i];
if (entry.key === key) {
total -= entry.size;
this.order.splice(i, 1);
break;
}
}
}
while (total > this.maxSize) {
var entry = this.order.shift();
delete this.cache[entry.key];
total -= entry.size;
}
this.cache[key] = object;
this.order.push({ size: size, key: key });
this.size = total;
},
get: function(key) {
var value = this.cache[key];
if (typeof(value) !== 'undefined') { // Return this key for longer
for (var i = 0; i < this.order.length; ++i) {
var entry = this.order[i];
if (entry.key === key) {
this.order.splice(i, 1);
this.order.push(entry);
break;
}
}
}
return value;
},
getObjectSize: function(object) {
// Code from above estimating functions
},
};
มันเป็นตัวอย่างที่ง่ายและอาจมีข้อผิดพลาดบางอย่าง แต่มันให้ความคิดเนื่องจากคุณสามารถใช้มันเพื่อจับวัตถุแบบสแตติก (เนื้อหาจะไม่เปลี่ยนแปลง) ด้วยความฉลาดระดับหนึ่ง สิ่งนี้สามารถลดความต้องการการประมวลผลที่มีราคาแพงอย่างมากที่วัตถุจะต้องมีการผลิตในสถานที่แรก