我正在使用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);
}
有没有办法解决这个问题?我是否需要将数组拼接成较小的位并进行转换,然后将其粘贴在一起,如果可以,我该如何处理?
答案 0 :(得分:1)
根据MDN,函数的硬编码限制是传递给函数的65,536个参数。如果您的Int8Array具有超过600,000个元素,那么您提供的apply
调用会死掉,原因是所提供的参数比可以提供的多10倍。您可以按照自己说的进行拆分,但是也可以在Int8Array上调用reduce
并一遍遍地完成所有操作:
int8View.reduce((arr, int8) => arr.concat( String.fromCharCode(int8) ), []);