Uncaught Rangeerror: Превышен Callstack при попытке преобразовать Int8Array в String/JSON
Я использую веб-сборки для извлечения данных JSON и сохранения их в IndexedDB. Мне удается получить его как Int8Array из IndexedDB, преобразовать в строку и затем проанализировать в JSON, когда он достаточно мал, но когда данные слишком велики, выдает ошибку:
Uncaught RangeError: Maximum call stack size exceeded
Скриншот консоли журналов:
Ответственный бит кода:
function ConvertToJSON(result){
console.log("= Converting to JSON =");
console.log(result);
let int8View = new Int8Array(result[0]);
console.log(int8View);
let str = String.fromCharCode.apply(String, int8View); //RangeError when array too large...
let json = JSON.parse(str);
console.log(json);
AddJSONToPage(json);
}
Есть ли способ обойти эту проблему? Нужно ли разбивать массив на более мелкие биты и преобразовывать, а затем вставлять его вместе, и если да, то как мне это сделать?
1 ответ
Согласно MDN, функции имеют жестко ограниченный предел в 65 536 аргументов, передаваемых в функции. С вашим Int8Array, имеющим более 600 000 элементов, ваш apply
Вызов умирает из-за увеличения в 10 раз аргументов, чем может быть. Вы можете разделить это, как вы говорите, но вы также можете позвонить reduce
на Int8Array и сделайте все это за один проход:
int8View.reduce((arr, int8) => arr.concat( String.fromCharCode(int8) ), []);