Chrome 存储同步以持久顺序获取项目

问题描述 投票:0回答:2

我正在使用一个 Chrome 扩展程序,该扩展程序存储 SoundCloud 中项目的临时播放列表,以便稍后对其执行多项操作。 所以...我知道 Chrome Storage 是一个对象并且“不能”订购本身,但我确实需要以任何可行的方式进行订购。

我尝试将对象存储在数组中,然后在数组末尾推送一个新元素后将该数组存储在存储中,这是完美的解决方法,直到其中有 27 个对象时,Chrome 告诉我已达到内存限制(我'我将需要更多元素来存储。) 将每个元素存储为单独的对象实际上允许我使用任意数量的元素(我认为 50mb,这肯定足够了),但 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;

}

我认为重要的是,除了订单问题之外,没有任何问题,一切都运行良好,尽管有些事情肯定可以更“优雅”。 预先感谢您,希望您能帮忙!

javascript google-chrome google-chrome-extension soundcloud
2个回答
0
投票

问题是您超出了

QUOTA_BYTES_PER_ITEM
,即每个对象允许的存储限制。如果您使用
chrome.storage.sync
,则只能使用
8,192 Bytes
。使用
chrome.storage.local
将允许您存储每个项目的无限大小。

注意使用

chrome.storage.local
使您的数据位于该计算机本地,因此不会在不同计算机上的浏览器之间同步。


0
投票

感谢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() {

    });

})

}

© www.soinside.com 2019 - 2024. All rights reserved.