未捕获的Rangeerror:尝试将Int8Array转换为String / JSON时超出了Callstack

时间:2019-01-22 17:36:54

标签: javascript arrays indexeddb uint8array

我正在使用Webassembly来获取JSON数据,并将其保存到IndexedDB。我可以设法从IndexedDB中将其作为Int8Array进行获取,并将其转换为字符串,然后在其足够小时解析为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 :(得分:1)

根据MDN,函数的硬编码限制是传递给函数的65,536个参数。如果您的Int8Array具有超过600,000个元素,那么您提供的apply调用会死掉,原因是所提供的参数比可以提供的多10倍。您可以按照自己说的进行拆分,但是也可以在Int8Array上调用reduce并一遍遍地完成所有操作:

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