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