【发布时间】:2019-08-28 23:50:48
【问题描述】:
我是 React 新手,但在获取时遇到问题:
我一直在做一个响应项目,我必须根据用户选择的公司从五个不同的 url 中获取。 代码我改过很多次了,还是不行。
我尝试使用 componentDidMount(但它只调用一次,并且我想获取许多 url),使用“while(!this.state)”忙于等待获取数据,然后再分配它等等。
获取函数:
async fetch_data() {
var sel = this.props.select;
symbol = companies[sel];
url = 'https://www.alphavantage.co/query?function=' + func + '&symbol=' + symbol + '&outputsize=' + osize + '&apikey=' + api_key;
var response = await fetch(url);
var data = await response.json();
while(!data);
this.setState({data: data, loading: false });
this.setValues();
}
设置值功能(修剪,使其不那么长):
setValues() {
day = this.state.data["Meta Data"]["3. Last Refreshed"];
open = this.state.data["Time Series (Daily)"][day]["1. open"];
higher = this.state.data["Time Series (Daily)"][day]["2. high"];
}
渲染函数(也被修剪):
render() {
this.fetch_data();
if(this.state.loading || !this.state || !this.state.data) {
return <div>Loading :D...</div>
} else {
return (
<div>
<h2>Symbol: {symbol}</h2>
<p>Url: {url}</p>
<ul>
<li>
Open price: {open}
</li>
<li>
Higher price: {higher}
</li>
</ul>
</div>
);
}
}
实际上,当用户选择公司时,我已经完成了该部分,并且符号(和 url)发生了变化......
但问题是,当程序想要访问this.state.data["Time Series (Daily)"][day]["1. open"]; 时,它会崩溃,因为它正在获取和接收数据。
错误提示:
Unhandled Rejection (TypeError): Cannot read property '3. Last Refreshed' of undefined:
42 | setValues() {
> 43 | day = this.state.data["Meta Data"]["3. Last Refreshed"];
| ^ 44 | open = this.state.data["Time Series (Daily)"][day]["1. open"];
45 | higher = this.state.data["Time Series (Daily)"][day]["2. high"];
应用程序并不总是崩溃,它会显示结果,但渲染组件会一直调用 this.fetch_data() 并且它会崩溃,因为有时(比如 80% 的时间)数据还没有到达,而我'我正在尝试访问它。
【问题讨论】:
-
您可以删除
while(!data);。await关键字将确保在调用setState之前为data分配一个值。 -
试试这个替换 this.setValues() 到 requestAnimationFrame(this.setValues)
-
它也不起作用:(
标签: javascript json reactjs fetch