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

v9tzhpje  于 2024-01-04  发布在  Go
关注(0)|答案(2)|浏览(245)

我正在使用一个Chrome扩展程序,该扩展程序存储SoundCloud中项目的临时播放列表,以便稍后对其执行几个操作。所以.我知道Chrome存储是一个对象,“不能”按 * 本身 * 排序,但我真的需要以任何可行的方式排序。
我尝试将对象存储在数组中,然后在最后推送一个新元素后将该数组存储在存储中,这是一个完美的解决方案,直到其中有27个对象,Chrome告诉我,我已经达到内存限制(我需要存储更多的元素。)将每个元素存储为单独的对象实际上允许存储任意数量的元素(我认为50 mb,这肯定足够了),但是get方法以它想要的方式抛出元素(很明显,作为一个对象)。
有没有一种“轻量级”的方法来做到这一点呢?代码并不是决定性的,我在考虑直接将元素追加到一个新窗口中,将存储调用留给其他东西,然后转向“轻量级”代码,但首先想知道这是否可能。

CODE- popup.js(这里是顺序不持久的地方)

  1. function appendTracks(){
  2. chrome.storage.sync.get(null, function (storageObject) {
  3. //TODO check if is song
  4. $.each( storageObject, function( key, trackData ) {
  5. trackContainer(trackData["permalink"]);
  6. });
  7. });
  8. }
  9. function trackContainer(trackPermalink){
  10. console.log(trackPermalink);
  11. var trackWidget;
  12. $.getJSON(
  13. 'http://soundcloud.com/oembed' +
  14. '?format=json' +
  15. '&url='+trackPermalink+'&visual=false'
  16. ).done(function (embedData) {
  17. trackWidget = embedData.html;
  18. $("#mainPlayList").append(trackWidget);
  19. });
  20. console.log(trackWidget);
  21. return trackWidget;
  22. }

字符串

CODE- main.js(以时间戳为键的存储设置器)

  1. function downloadClick(a) {
  2. playListName = "";
  3. var b = this;
  4. $.ajax({
  5. url: a.data.reqUrl
  6. }).done(function(a) {
  7. var time = Date.now();
  8. var timeStamp = Math.round(time/1000);
  9. var key = timeStamp.toString()+"queueSc";
  10. var trackData = {
  11. "trackId" : a["id"],
  12. "trackTitle" : a["title"],
  13. "thumbnail" : a["artwork_url"],
  14. "streamUrl" : a["stream_url"],
  15. "permalink" : a["permalink_url"],
  16. "duration" : a["duration"],
  17. "genre" : a["genre"]};
  18. trackData[key] = "key";
  19. getStorage(null,function(storageObject){
  20. if(!isTrackInList(trackData,storageObject)){
  21. setStorage({
  22. [key]: trackData
  23. });
  24. }else{
  25. console.log("ya esta en la lista");
  26. }
  27. });
  28. })
  29. }
  30. function isTrackInList(trackData, storageObject){
  31. var isInList = false;
  32. $.each( storageObject, function( key, value ) {
  33. if(trackData["trackId"] == value["trackId"]){
  34. isInList = true;
  35. }
  36. });
  37. return isInList;
  38. }


我认为重要的是要说,除了订单问题,没有任何问题,一切都运行良好,虽然有些事情可以更“优雅”的肯定。提前感谢,希望你能帮助!

n9vozmp4

n9vozmp41#

问题是你超过了QUOTA_BYTES_PER_ITEM,即每个对象允许的存储限制。如果你使用chrome.storage.sync,你将被限制为8,192 Bytes。使用chrome.storage.local将允许你存储每个项目的无限大小。

注意使用chrome.storage.local会使您的数据本地化到该机器,因此不会在不同机器上的浏览器之间同步。

blmhpbnm

blmhpbnm2#

感谢EyuelDK,最后需要一个callc调用,我将尝试解决这个问题。

CODE- popup.js

  1. function appendTracks(){
  2. chrome.storage.local.get("souncloudQueue", function (storageObject) {
  3. var length = storageObject["souncloudQueue"].length;
  4. for (var i=0;i<length;i++){
  5. var trackPermalink = storageObject["souncloudQueue"][i];
  6. console.log(i, trackPermalink);
  7. $("#mainPlayList").append(trackContainer(trackPermalink));
  8. }
  9. });
  10. }
  11. function trackContainer(trackPermalink){
  12. console.log(trackPermalink);
  13. var trackWidget;
  14. $.ajax({
  15. url: 'http://soundcloud.com/oembed' +
  16. '?format=json' +
  17. '&url='+trackPermalink,
  18. dataType: 'json',
  19. async: false,
  20. success: function(data) {
  21. trackWidget = data.html;
  22. }
  23. });
  24. console.log(trackWidget);
  25. return trackWidget;
  26. }

字符串

CODE- main.js

  1. function downloadClick(a) {
  2. var trackUrl = a.data.reqUrl;
  3. console.log(trackUrl);
  4. getStorage("souncloudQueue", function(callback){
  5. console.log(callback["souncloudQueue"]);
  6. var tempArray = callback["souncloudQueue"];
  7. tempArray.push(trackUrl);
  8. setStorage({"souncloudQueue": tempArray}, function() {
  9. });
  10. })


}

展开查看全部

相关问题