我正在使用一个Chrome扩展程序,该扩展程序存储SoundCloud中项目的临时播放列表,以便稍后对其执行几个操作。所以.我知道Chrome存储是一个对象,“不能”按 * 本身 * 排序,但我真的需要以任何可行的方式排序。
我尝试将对象存储在数组中,然后在最后推送一个新元素后将该数组存储在存储中,这是一个完美的解决方案,直到其中有27个对象,Chrome告诉我,我已经达到内存限制(我需要存储更多的元素。)将每个元素存储为单独的对象实际上允许存储任意数量的元素(我认为50 mb,这肯定足够了),但是get方法以它想要的方式抛出元素(很明显,作为一个对象)。
有没有一种“轻量级”的方法来做到这一点呢?代码并不是决定性的,我在考虑直接将元素追加到一个新窗口中,将存储调用留给其他东西,然后转向“轻量级”代码,但首先想知道这是否可能。
CODE- popup.js(这里是顺序不持久的地方)
function appendTracks(){
chrome.storage.sync.get(null, function (storageObject) {
//TODO check if is song
$.each( storageObject, function( key, trackData ) {
trackContainer(trackData["permalink"]);
});
});
}
function trackContainer(trackPermalink){
console.log(trackPermalink);
var trackWidget;
$.getJSON(
'http://soundcloud.com/oembed' +
'?format=json' +
'&url='+trackPermalink+'&visual=false'
).done(function (embedData) {
trackWidget = embedData.html;
$("#mainPlayList").append(trackWidget);
});
console.log(trackWidget);
return trackWidget;
}
字符串
CODE- main.js(以时间戳为键的存储设置器)
function downloadClick(a) {
playListName = "";
var b = this;
$.ajax({
url: a.data.reqUrl
}).done(function(a) {
var time = Date.now();
var timeStamp = Math.round(time/1000);
var key = timeStamp.toString()+"queueSc";
var trackData = {
"trackId" : a["id"],
"trackTitle" : a["title"],
"thumbnail" : a["artwork_url"],
"streamUrl" : a["stream_url"],
"permalink" : a["permalink_url"],
"duration" : a["duration"],
"genre" : a["genre"]};
trackData[key] = "key";
getStorage(null,function(storageObject){
if(!isTrackInList(trackData,storageObject)){
setStorage({
[key]: trackData
});
}else{
console.log("ya esta en la lista");
}
});
})
}
function isTrackInList(trackData, storageObject){
var isInList = false;
$.each( storageObject, function( key, value ) {
if(trackData["trackId"] == value["trackId"]){
isInList = true;
}
});
return isInList;
}
型
我认为重要的是要说,除了订单问题,没有任何问题,一切都运行良好,虽然有些事情可以更“优雅”的肯定。提前感谢,希望你能帮助!
2条答案
按热度按时间n9vozmp41#
问题是你超过了
QUOTA_BYTES_PER_ITEM
,即每个对象允许的存储限制。如果你使用chrome.storage.sync
,你将被限制为8,192 Bytes
。使用chrome.storage.local
将允许你存储每个项目的无限大小。注意使用
chrome.storage.local
会使您的数据本地化到该机器,因此不会在不同机器上的浏览器之间同步。blmhpbnm2#
感谢EyuelDK,最后需要一个callc调用,我将尝试解决这个问题。
CODE- popup.js
字符串
CODE- main.js
型
}