Chrome 存储同步以固定顺序获取项目
Chrome Storage Sync get items in a persistent order
我在 chrome 扩展中工作,该扩展存储 SoundCloud 中项目的临时播放列表,以便稍后对其执行多项操作。
所以...我知道 Chrome 存储是一个对象并且 "can´t" 本身 被排序 ,但我确实需要以任何可行的方式进行排序。
我尝试将对象存储在数组中,然后在数组末尾推送一个新元素后将该数组存储在存储中,这是完美的解决方法,直到其中有 27 个对象,chrome 告诉我我已达到内存限制(我需要更多的元素来存储。)
将每个元素存储为单独的对象几乎允许我使用任何数量的元素(我认为 50mb,这肯定足够了),但是 get 方法以它想要的方式抛出元素(显然,是一个对象)。
对象使用时间戳键存储,但仍然根本不起作用。
是否有 "light way" 可以这样做?
代码不是确定的,我正在考虑将元素直接附加到新的 window,留下其他内容的存储调用并移至 "lighter" 代码,但首先想知道这是否可能。
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(以时间戳为键的存储 Setter)
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;
}
我认为重要的是要说除了订单问题之外没有任何问题,一切都运行良好,尽管有些事情肯定会更多 "ellegant"。
在此先感谢,希望您能提供帮助!
问题是您超出了 QUOTA_BYTES_PER_ITEM
,即每个对象允许的存储限制。如果您使用 chrome.storage.sync
,您将被限制为 8,192 Bytes
。使用 chrome.storage.local
将允许您存储每个项目的无限大小。
注意 使用 chrome.storage.local
使您的数据在该机器上本地化,因此不会跨不同机器上的浏览器同步。
感谢EyuelDK,终于需要一个异步调用,我会尝试解决下一个问题。
代码 - popup.js
function appendTracks(){
chrome.storage.local.get("souncloudQueue", function (storageObject) {
var length = storageObject["souncloudQueue"].length;
for (var i=0;i<length;i++){
var trackPermalink = storageObject["souncloudQueue"][i];
console.log(i, trackPermalink);
$("#mainPlayList").append(trackContainer(trackPermalink));
}
});
}
function trackContainer(trackPermalink){
console.log(trackPermalink);
var trackWidget;
$.ajax({
url: 'http://soundcloud.com/oembed' +
'?format=json' +
'&url='+trackPermalink,
dataType: 'json',
async: false,
success: function(data) {
trackWidget = data.html;
}
});
console.log(trackWidget);
return trackWidget;
}
代码 - main.js
function downloadClick(a) {
var trackUrl = a.data.reqUrl;
console.log(trackUrl);
getStorage("souncloudQueue", function(callback){
console.log(callback["souncloudQueue"]);
var tempArray = callback["souncloudQueue"];
tempArray.push(trackUrl);
setStorage({"souncloudQueue": tempArray}, function() {
});
})
}
我在 chrome 扩展中工作,该扩展存储 SoundCloud 中项目的临时播放列表,以便稍后对其执行多项操作。 所以...我知道 Chrome 存储是一个对象并且 "can´t" 本身 被排序 ,但我确实需要以任何可行的方式进行排序。 我尝试将对象存储在数组中,然后在数组末尾推送一个新元素后将该数组存储在存储中,这是完美的解决方法,直到其中有 27 个对象,chrome 告诉我我已达到内存限制(我需要更多的元素来存储。) 将每个元素存储为单独的对象几乎允许我使用任何数量的元素(我认为 50mb,这肯定足够了),但是 get 方法以它想要的方式抛出元素(显然,是一个对象)。 对象使用时间戳键存储,但仍然根本不起作用。
是否有 "light way" 可以这样做? 代码不是确定的,我正在考虑将元素直接附加到新的 window,留下其他内容的存储调用并移至 "lighter" 代码,但首先想知道这是否可能。
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(以时间戳为键的存储 Setter)
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;
}
我认为重要的是要说除了订单问题之外没有任何问题,一切都运行良好,尽管有些事情肯定会更多 "ellegant"。 在此先感谢,希望您能提供帮助!
问题是您超出了 QUOTA_BYTES_PER_ITEM
,即每个对象允许的存储限制。如果您使用 chrome.storage.sync
,您将被限制为 8,192 Bytes
。使用 chrome.storage.local
将允许您存储每个项目的无限大小。
注意 使用 chrome.storage.local
使您的数据在该机器上本地化,因此不会跨不同机器上的浏览器同步。
感谢EyuelDK,终于需要一个异步调用,我会尝试解决下一个问题。
代码 - popup.js
function appendTracks(){
chrome.storage.local.get("souncloudQueue", function (storageObject) {
var length = storageObject["souncloudQueue"].length;
for (var i=0;i<length;i++){
var trackPermalink = storageObject["souncloudQueue"][i];
console.log(i, trackPermalink);
$("#mainPlayList").append(trackContainer(trackPermalink));
}
});
}
function trackContainer(trackPermalink){
console.log(trackPermalink);
var trackWidget;
$.ajax({
url: 'http://soundcloud.com/oembed' +
'?format=json' +
'&url='+trackPermalink,
dataType: 'json',
async: false,
success: function(data) {
trackWidget = data.html;
}
});
console.log(trackWidget);
return trackWidget;
}
代码 - main.js
function downloadClick(a) {
var trackUrl = a.data.reqUrl;
console.log(trackUrl);
getStorage("souncloudQueue", function(callback){
console.log(callback["souncloudQueue"]);
var tempArray = callback["souncloudQueue"];
tempArray.push(trackUrl);
setStorage({"souncloudQueue": tempArray}, function() {
});
})
}