我从服务器获取某种编码数据,应该正确解码并在客户端显示为字符串(UTF-16)。此刻我正在做这样的事情:
_decodeContent: function(encodedContent) {
var binaryContent = atob(encodedContent);
var result = pako.inflate(binaryContent, { to: 'string' });
return result;
}
在大多数情况下,它工作正常。但有时客户端必须处理大量数据,因此它会冻结(Google Chrome 51.0.2704.84)甚至崩溃(Chromium 50.0.2661.102)浏览器选项卡。所以我发现,问题是 pako 的 inflate 方法中的 { to: 'string' } 选项,同时尝试将包含大约 50kk 个元素的 Uint8Array 转换为 UTF-16 字符串。
我试图以这样的方式手动转换它:
_decodeContent: function(encodedContent) {
var binaryContent = atob(encodedContent);
var utf8 = pako.inflate(binaryContent);
var result = String.fromCharCode.apply(null, utf8);
return result;
}
但它会产生:Uncaught RangeError: Maximum call stack size exceeded
所以现在我正在寻找解决方案,让事情变得更快,或者至少防止浏览器崩溃。有任何想法吗?
UPD:尝试String.fromCharCode.apply
使用块来防止异常。所以异常的问题得到了解决,但它的工作速度比第一个解决方案慢两倍。
UPD:所以问题是如何将大量 Uint8Array 转换为 UTF-16 字符串以防止浏览器冻结。