react 把前后台的axios请求放在一起_在React.js中将Async / Await与Axios一起使用

Following

I am trying to make a simple get request to my server using Async/Await in a React.js App.

The server loads a simple JSON at /data which looks like this

JSON

{

id: 1,

name: "Aditya"

}

I am able to get the data to my React App using simple jquery ajax get method.

However, I want to make use of axios library and Async/Await to follow ES7 standards.

My current code looks like this:

class App extends React.Component{

async getData(){

const res = await axios('/data');

console.log(res.json());

}

render(){

return(

{this.getData()}

);

}

}

Using this approach I get the following error:

Objects are not valid as a React child (found: [object Promise]). If

you meant to render a collection of children, use an array instead.

Am I not implementing it correctly?

解决方案

Two issues jump out:

Your getData never returns anything, so its promise (async functions always return a promise) will resolve with undefined when it resolves

The error message clearly shows you're trying to directly render the promise getData returns, rather than waiting for it to resolve and then rendering the resolution

Addressing #1: getData should return the result of calling json:

async getData(){

const res = await axios('/data');

return await res.json();

}

Addressig #2: We'd have to see more of your code, but fundamentally, you can't do

{getData()}

...because that doesn't wait for the resolution. You'd need instead to use getData to set state:

this.getData().then(data => this.setState({data}))

.catch(err => { /*...handle the error...*/});

...and use that state when rendering:

{this.state.data}

Update: Now that you've shown us your code, you'd need to do something like this:

class App extends React.Component{

async getData() {

const res = await axios('/data');

return await res.json(); // (Or whatever)

}

constructor(...args) {

super(...args);

this.state = {data: null};

}

componentDidMount() {

if (!this.state.data) {

this.getData().then(data => this.setState({data}))

.catch(err => { /*...handle the error...*/});

}

}

render() {

return (

{this.state.data ? Loading... : this.state.data}

);

}

}

Futher update: You've indicated a preference for using await in componentDidMount rather than then and catch. You'd do that by nesting an async IIFE function within it and ensuring that function can't throw. (componentDidMount itself can't be async, nothing will consume that promise.) E.g.:

class App extends React.Component{

async getData() {

const res = await axios('/data');

return await res.json(); // (Or whatever)

}

constructor(...args) {

super(...args);

this.state = {data: null};

}

componentDidMount() {

if (!this.state.data) {

(async () => {

try {

this.setState({data: await this.getData()});

} catch (e) {

//...handle the error...

}

})();

}

}

render() {

return (

{this.state.data ? Loading... : this.state.data}

);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值