gpt4 book ai didi

javascript - Chrome 不支持 TypedArray.prototype.slice()

转载 作者:行者123 更新时间:2023-12-03 07:43:22 25 4
gpt4 key购买 nike

我想使用 Uint8Array 和 slice() 函数上传大文件。需要 slice(),因为也必须处理大文件。

var fileReader = new FileReader();

fileReader.onloadend = function(event) {
var contents = new Uint8Array(event.target.result);

var bufferSize = 8192;
var byteBuffer = [];

var temp = null;
var pos = 0;
for(var i = 0; i < contents.length; i+=bufferSize) {
pos = contents.length > i+bufferSize ? i+bufferSize : contents.length;
byteBuffer.push(String.fromCharCode.apply(null, contents.slice(i, pos)));
}

var bytes = byteBuffer.join('');

contents = undefined;
byteBuffer = undefined;

var formData = new FormData();
formData.append('name', 'somefile.dat');
formData.append('data', bytes);

// do the POST formData

};

上面的代码仅适用于 Firefox。

所有浏览器都支持 Uint8Array: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array

问题是Uint8Array继承自TypedArray,上面的代码使用了TypedArray.prototype.slice()函数。仅 Firefox 支持:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice

还有一个 subarray() 函数,但它不会创建浅拷贝。处理大文件时,创建深层复制并不是一个好主意。

我也查看了 lodash 的 slice(),但它是针对 Array 而不是 TypedArray。所以这对我来说不起作用。

也许我应该编写一个函数来创建子数组的浅拷贝?

最佳答案

只需使用 subarray() 代替 slice()

两者在这里的工作原理相同,并且可能调用相同的内部实现。查看使用 Firefox 的基准测试: http://jsperf.com/array-slice-vs-typedarray-subarray

(但是,TypedArray.slice()TypedArray.subarray() 的文档略有不同: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array )

关于javascript - Chrome 不支持 TypedArray.prototype.slice(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35313993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com