【问题标题】:TypedArray.prototype.slice() not supported on ChromeChrome 不支持 TypedArray.prototype.slice()
【发布时间】:2016-05-20 17:36:12
【问题描述】:

我想上传大文件,使用 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() 做一个深拷贝,我认为它只是在同一个缓冲区上创建一个新的Uint8Array 视图。
  • 这是真的。 subarray()slice() 一样快。谢谢

标签: javascript arrays google-chrome file-upload slice


【解决方案1】:

只需使用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)

【讨论】:

    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 2014-01-23
    • 2018-03-16
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多