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) ), []);
Другие вопросы по тегам