我正在使用webassembly来获取JSON数据,并将其保存到IndexedDB。我可以设法从IndexedDB中将其获取为Int8Array,然后将其转换为字符串,然后在其足够小的时候解析为JSON,但是当数据太大时会出现错误:

Uncaught RangeError: Maximum call stack size exceeded


控制台日志的屏幕截图:

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

负责一点的代码:

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) ), []);

09-27 10:22