Uncaught Rangeerror: Превышен Callstack при попытке преобразовать Int8Array в String / JSON - PullRequest
0 голосов
/ 22 января 2019

Я использую веб-сборки для извлечения данных JSON и сохранения их в IndexedDB. Мне удается получить его как Int8Array из IndexedDB, преобразовать в строку и затем проанализировать в JSON, когда он достаточно мал, но когда данные слишком велики, выдает ошибку:

Uncaught RangeError: Maximum call stack size exceeded

Снимок экрана журналов консоли:

Console

Ответственный бит кода:

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 Ответ

0 голосов
/ 05 февраля 2019

Согласно MDN функции имеют жестко заданный предел в 65 536 аргументов, передаваемых в функции.Поскольку ваш Int8Array содержит более 600 000 элементов, ваш вызов apply умирает из-за того, что было предоставлено в 10 раз больше аргументов, чем может быть.Вы можете разделить его, как говорите, но вы также можете вызвать reduce на Int8Array и сделать все за один проход:

int8View.reduce((arr, int8) => arr.concat( String.fromCharCode(int8) ), []);
...