Chrome API: превышена квота времени выполнения QUOTA_BYTES_PER_ITEM Ошибка, но предварительная проверка проходит

Я получаю ошибку превышения квоты QUOTA_BYTES_PER_ITEM при попытке сохранить объект в хранилище, но моя предварительная проверка размера проходит. Я уверен, что делаю здесь какую-то основную ошибку (это правильный способ проверить размер объекта?). Я уже сжал элемент, который хочу сохранить, с помощью LZString, но, тем не менее, он кажется намного меньше квоты.

      var objToSave = {};   
objToSave[myKey] = compressedObj;  

console.log("Size of obj is: " + JSON.stringify(objToSave).length); //prints 3452
console.log(chrome.storage.sync.QUOTA_BYTES_PER_ITEM); //prints 8192
if (JSON.stringify(objToSave).length >= (chrome.storage.sync.QUOTA_BYTES_PER_ITEM)) { // this never triggers
      alert('objToSave is too large!');  
      return;   
}

chrome.storage.sync.set(objToSave, function() {    
  if (chrome.runtime.lastError) { // this error gets triggered.
    console.log("Error: " + chrome.runtime.lastError.message); // this error gets triggered. 
    return customAlert("Error!: " + chrome.runtime.lastError.message);    
  }   
});

2 ответа

Спасибо @nishant и @wOxxOm - это как раз ошибка. Я неправильно проверял размер.

Чтобы правильно проверить размер, я теперь использую, чтобы получить размер байта по сравнению с длиной строки

      var s = JSON.stringify(objToSave);
encodeURI(s).split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./).length-1)

что дает мне размер 10765, который я больше не разбиваю, используя ответ @wOxxOm на /questions/57451687/algoritm-razbivki-elementa-dlya-sinhronizatsii-hranilischa-chrome/57542781#57542781

Что ж, единственная логическая причина, по которой вы получаете QUOTA_BYTES_PER_ITEM, заключается в том, что вы пытаетесь использовать строку, превышающую эту отметку 8k ...

Однако есть 2 вещи, которые, как мне кажется, могут здесь пойти не так ...

  1. Дважды проверьте пару ключ: значение
  2. "переменная длина байта" Поскольку вы кодируете строку, может быть небольшая вероятность того, что ваша строка будет заполнена 2-байтовыми данными [если код символа больше 256 или (<= 0xFF), то размер байта равен 2, ваш строка может быть 3452, но заполнена 2 байтами, тогда она будет пересекать отметку 8k, это может быть просто слепое пятно.
Другие вопросы по тегам