【发布时间】: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