IE11 对象不支持 属性 或方法 'Symbol(Symbol.iterator)_a.2p3bca3ct9h

IE11 Object doesn't support property or method 'Symbol(Symbol.iterator)_a.2p3bca3ct9h

我正在使用Angular 8, tslint 5.15 & typescript v3

我正在使用以下代码 ArryaBuffer 读取文件

const reader = new FileReader();
    reader.readAsArrayBuffer(<FileObject>);
    reader.onload = () => {
      this.uploadedData= new Uint8Array(reader.result as ArrayBuffer);
    }

现在,当我将此 uploadedData 传递给 API 时,我正在使用以下函数将其转换为 byteArray。

convertLicenseToByteArray(uploadedData) {
    const bytesArray = [];
    for (const i of uploadedData) {
      bytesArray.push(i);
    }
    return bytesArray;
  }

以上代码在ie11中报错,

ERROR TypeError: Object doesn't support property or method 'Symbol(Symbol.iterator)_a.srxqdvyfxlx'

我尝试在网上搜索,发现我可能需要添加 babel-polyfill 但它对我不起作用。

有什么帮助吗?

IE11 几乎不支持任何 ES2015+,所以这意味着没有箭头函数、没有 Symbol、没有迭代器和迭代器。 (IE9-IE11 确实支持 constlet,但不正确。它们支持未标准化的早期版本。最大的差异在于 for 循环。)

如果您想 运行 在 IE11 上使用该代码,您需要将其转换为 ES5 并添加一些 polyfill。符号和可迭代性无法正确填充,但是 Babel and others provide something partially functional. I see here that Babel now recommends not using their own @babel/polyfill and instead using core-js directly (and regenerator runtime 如果您需要转换生成器函数)。

将“core-js”添加到您的 package.json 并将导入添加到您的 polyfills.ts

import 'core-js/es6/symbol';

问题与uploadedData参数有关,当我们调用convertLicenseToByteArray方法并使用uploadedData变量时,如果数据未填充或未定义,则会显示此错误。

您可以尝试在 reader onload 函数中调用 convertLicenseToByteArray 方法。

  const reader = new FileReader();    
  reader.onload = (_event) => { 
    this.uploadedData= new Uint8Array(reader.result as ArrayBuffer);   
    console.log(this.convertLicenseToByteArray(this.uploadedData).length);
  } 

对于可能在没有打字稿的 Aurelia 项目中遇到此问题的任何人,我能够通过安装 core-js 来解决它,其中包含使这项工作所需的 polyfill。

npm install --save core-js@3.6.5

然后我在遇到问题的 .js 文件中添加了导入,它开始工作了。

import "core-js"