[英]javascript async in react.js
在一个java脚本文件中,我有这个代码:
import axios from "axios";
let baseUrl = "http://localhost:8080";
export async function getData(parameter) {
let url=baseUrl.concat(parameter);
axios.get(url)
.then(function (response) {
console.log(response.data);
return response.data;
})
.catch(function (error) {
console.log("accessing " + url+ " got error : " +error);
});
}
在我的 User 类中,我写了这个:
class Users extends React.Component{
state={
userList:''
};
componentWillMount() {
this.setState(
(prevState,props)=>{
return {userList:await StaticData.getData("/users")};
}
);
console.log(this.state.userList);
}
render() {
return(
<div>
{this.state.userList}
</div>
);
}
}
export default Users;
CodeSandBoxing 无法使用,因为我使用的是本地主机。
首先,这给了我一个错误说 -只等待异步函数,它已经是,那么错误是什么
其次,如果我删除等待,为什么没有呈现新的 userData?
很抱歉,我们有很多错误和误解,我们需要在此处更新以解决此问题。
首先,函数中的await
不起作用,因为您没有将使用await
关键字的函数标记为async
函数。 所以你应该这样做
componentWillMount() {
this.setState(
async (prevState,props)=>{
return {userList:await StaticData.getData("/users")};
}
);
console.log(this.state.userList);
}
但这解决了关于await
的错误,它不会解决您原来的问题,这就是为什么不呈现数据......?
您需要知道使用 promise 调用http
的异步逻辑与从上到下、从左到右执行命令的普通同步代码不同。
当您使用 promise 时,您会告诉您的程序这里将以异步方式发生某些事情,这意味着我们不知道什么时候会返回结果。
这是一个例子
console.log('a');
axios.get('some url...').then( () => console.log('b') );
console.log('c');
这三个命令的结果是
a
c
b
现在看看你的问题,首先你必须在你的函数中返回 axios 承诺,它不需要是异步的,因为它没有在其中使用关键字await
export function getData(parameter) {
let url=baseUrl.concat(parameter);
return axios.get(url)
.then(function (response) {
console.log(response.data);
return response.data;
})
.catch(function (error) {
console.log("accessing " + url+ " got error : " +error);
});
}
最后,如果response.data
的返回值是一个数组,则您无法像在 React 中那样渲染它。 而是在jsx
使用map
函数,例如
<div>
{ this.state.userList.map(user => <div key={user.id}> { user.name } </div>) }
</div>
我建议您将获取数据逻辑放在 componentDidMount 而不是
首先,您应该返回承诺: return axios.get(url) ....
首先,这给了我一个错误说 - 只等待异步函数,它已经是,那么错误是什么
您正在使用箭头函数,因此它必须具有异步标识符:
componentWillMount() {
this.setState(
async (prevState,props)=>{
return {userList:await StaticData.getData("/users")};
}
);
console.log(this.state.userList);
}
最后,获取数据的最佳位置是componentDidMount
。
你的代码中有很多概念上的缺陷。
export async function getData(parameter) {
let url= baseUrl.concat(parameter);
try{
const response = await axios.get(url);
} catch (err) {
console.log("accessing " + url+ " got error : " +err);
}
}
要使用 Promise 然后用 catch 替换你的代码
export function getData(parameter) {
let url=baseUrl.concat(parameter);
return axios.get(url)
.then(function (response) {
console.log(response.data);
return response.data;
})
.catch(function (error) {
console.log("accessing " + url+ " got error : " +error);
});
}
此外,由于您使用的是箭头函数,因此 await 只能在异步函数内。 所以
this.setState(
async (prevState,props)=>{
return {userList:await StaticData.getData("/users")};
}
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.