我正在使用webassembly来获取JSON数据,并将其保存到IndexedDB。我可以设法从IndexedDB中将其获取为Int8Array,然后将其转换为字符串,然后在其足够小的时候解析为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);
}
有没有办法解决这个问题?我是否需要将数组拼接成较小的位并进行转换,然后将其粘贴到一起,如果是的话,我该如何处理?
最佳答案
根据MDN,函数具有传入函数的65,536个参数的硬编码限制。如果您的Int8Array具有超过600,000个元素,您的apply
调用会死掉,原因是所提供的参数超出了10倍。您可以按照自己的说法将其拆分,但是也可以在Int8Array上调用reduce
并一口气完成所有操作:
int8View.reduce((arr, int8) => arr.concat( String.fromCharCode(int8) ), []);