【问题标题】:React IE11 async causes Expected } errorReact IE11异步导致预期的}错误
【发布时间】:2018-06-29 19:23:49
【问题描述】:

我正在尝试一个基本 React Web 应用程序的教程,它在 chrome 中完美运行。这是我的代码:

import React, {Component} from 'react';

export default class App extends Component {
  async componentDidMount() {
    const [r1,r2] = await Promise.all([
        fetch('http://api.mywebsite.com/content/cars'),
        fetch('http://api.mywebsite.com/content/aircrafts'),
    ]);
    this.setState({content:await r1.json(),content2: await r2.json()});

  }
  render() {
    if(this.state) {
      console.log(this.state);
    }
    return (
        <div>hello</div>
    )
  }
}

这完全符合我在 Chrome 中的预期 - 加载 react 组件,获取一些数据,设置状态,并将状态打印到控制台。

但是,此代码无法在 Internet Explorer 11 中运行。我得到的只是一个空白页面,在我的开发人员工具中,我得到了错误

预期的“}”

当我点击错误链接时,它会突出显示这段代码:

  _createClass(App, [{
    key: 'componentDidMount',
    value: async function componentDidMount() {
      var _ref = await Promise.all([fetch('http://new.evermight.com/content/index'), fetch('http://new.evermight.com/content/index')]),
          _ref2 = _slicedToArray(_ref, 2),

带有指向value: async function componentDidMount() {行的箭头。

如何在 Internet Explorer 11 中进行这项工作?我只希望 setState 在 fetch 调用等完成后触发。我需要等待行为。


编辑

我正在使用 webpack 来编译我的项目。如果有帮助,这是我的 package.json 文件:

{
  "name": "scroll",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "animated": "^0.2.1",
    "es2015": "0.0.0",
    "gsap": "^1.20.3",
    "history": "^4.7.2",
    "jquery": "^3.2.1",
    "react": "^16.1.1",
    "react-dom": "^16.1.1",
    "react-ga": "^2.4.1",
    "react-router-dom": "^4.2.2",
    "react-scripts": "0.9.5",
    "react-transition-group": "^1.2.0",
    "scrollmagic": "^2.0.5",
    "video-element": "^1.0.3"
  },
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "clean-webpack-plugin": "^0.1.17",
    "css-loader": "^0.25.0",
    "eslint": "^4.13.0",
    "eslint-config-aqua": "^2.0.1",
    "eslint-plugin-react": "^7.5.1",
    "file-loader": "^0.9.0",
    "node-sass": "^3.10.1",
    "sass-loader": "^4.0.2",
    "style-loader": "^0.13.1",
    "uglifyjs-webpack-plugin": "^1.1.6",
    "url-loader": "^0.5.7",
    "webpack": "^3.8.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

这是我的 webpack.config.js

var webpack = require('webpack');
var CleanPlugin = require('clean-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
  entry: {app:'./src/Index.js'},

  output: {
    filename: '[name].bundle.js',
    chunkFilename: '[id].[hash].bundle.js',
  path: '/var/www/html/public/build',
    publicPath: '/build/'
  },
  plugins: [
        // This plugin minifies all the Javascript code of the final bundle

        new UglifyJsPlugin({
          uglifyOptions:{
            mangle:   true,
            compress: {
                warnings: false, // Suppress uglification warnings
            },
          }
        }),

        new webpack.optimize.CommonsChunkPlugin({
            name:      'main', // Move dependencies to our main file
            children:  true, // Look for common dependencies in all children,
            minChunks: 2, // How many times a dependency must come up before being extracted
        })
  ],
  module: {
    loaders: [
      { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader?presets[]=es2015&presets[]=react' },
      { test: /\.scss$/, loaders: [ 'style-loader', 'css-loader', 'sass-loader' ]},
      { test: /\.(jpg|gif|png|otf|eot|woff|svg|ttf)(\?.*)?$/, loader: "file-loader" }
    ]
  }
}

【问题讨论】:

  • IE 不支持异步等待,你应该改用 Promise
  • IE11 既不支持 async/await 也不支持 Promise。但如果你要注入 babel polyfill,最后你可以实际使用。但我们需要了解您运行 Web 应用程序的准确程度。您是否尝试使用 create-react-app?我记得它的包装盒中预装了一些 polyfill。如果你不这样做,你会使用 webpack 吗?我只是想理解。我的意思是 IE11 也不支持类,所以你实际上不能“裸”运行这段代码
  • @AlexeyAvdeyev 谢谢你的建议。我在 EDIT 部分添加了注释,显示我的 package.json 和 webpack.config.js 是否有帮助?
  • 是的。只需从babeljs.io/docs/usage/polyfill 添加另一个包,然后按照简易指南将其注入您的项目中。之后,您可以使用 Shubham Khatri 回答中的 Promise 示例。暂时忘记异步/等待
  • 看起来你安装了 babel 但没有配置 webpack 来使用它

标签: reactjs async-await internet-explorer-11


【解决方案1】:

实际上,我确实收到了async 并等待在 IE11 中工作。在我的问题中,我也遇到了 IE11 不支持 fetch 的问题。这是我为解决这两个问题所做的工作。我去了我的 bash 终端并输入了这个

npm install --save es6-promise
npm install --save-dev babel-polyfill
npm install --save-dev babel-plugin-transform-async-to-generator
npm install --save isomorphic-fetch

接下来,我将这两行添加到我的src/Index.js 开头的任何其他代码之前,因为它是我的入口点:

import "babel-polyfill";
import "isomorphic-fetch";

然后我运行webpack 命令,现在我的IE11 支持我用async await 创建的代码,它支持fetch 命令。

【讨论】:

    【解决方案2】:

    async-await 在 IE 中不受支持。

    查看 MDN docs

    你需要使用Promises来代替

     componentDidMount() {
        Promise.all([
            fetch('http://api.mywebsite.com/content/cars'),
            fetch('http://api.mywebsite.com/content/aircrafts'),
        ]).then(([r1, r2]) => {
            this.setState({content:r1.json(),content2: r2.json()});
        })
    
     }
    

    另外,为了支持 IE 中的 Promise,您需要使用第三方 Polyfill 库,例如 BlueBird 或使用 babel-polyfill

    【讨论】:

    • 我尝试了您的解决方案,但得到了Promise is undefined 和一些in Unknown 错误
    • 抱歉复制粘贴错误,setState中不需要等待
    • 事实证明,IE 甚至不支持 Promise。检查此stackoverflow.com/questions/36016327/… 以修复它
    • babel-polyfill 提供了帮助。我做了npm install --save babel-polyfill,然后我将import "babel-polyfill"这一行添加到我的src/Index.js文件的顶部,这是我的入口文件。
    • 但后来,我收到了fetch is undefined error。所以我然后做了一个npm install --save isomorphic-fetchnpm install --save es6-promise。然后我在import "babel-polyfill" 之后立即添加了import "isomorphic-fetch" 行,所以我的src/Index.js。这解决了我的提取错误。
    猜你喜欢
    • 2021-06-01
    • 2019-07-02
    • 1970-01-01
    • 2015-12-09
    • 2015-11-02
    • 2020-07-03
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多