【问题标题】:Updating state after api call successapi调用成功后更新状态
【发布时间】:2018-02-09 23:03:57
【问题描述】:

花了两天时间阅读和研究可能导致问题的原因,但我就是不明白。

我有两个 API:一个来自 NASA 的卫星位置,另一个来自 GIS 软件的地图图层。我尝试通过获取空间中卫星位置的当前坐标来更新地图坐标。这将每 1 秒触发一次,它将根据卫星的坐标更新地图的位置。但是,状态不会更新。

代码如下:

let url = 'http://api.open-notify.org/iss-now.json';

class Basemap extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            center: [31, 13]
        };
    }
    componentDidMount() {
        this.getCenter();
        this.interval = setInterval(this.getCenter, 2000);
    }
    getCenter() {
        fetch(url)
                .then(d => d.json())
                .then(d => (d) => {
                    this.setState({
                      center: [d.iss_position.latitude, + ', ' + 
                               d.iss_position.longitude]
                    });
                });
    }
    render() {
        return (
            <Map style={{ width: '100vw', height: '100vh' }} 
                    mapProperties={{ basemap: 'satellite' }} 
                    viewProperties= { this.state } />
        );
    }
}

export default Basemap;

我通过重新触发 fetch 函数每秒成功检索卫星的更新坐标,但是地图的状态没有改变。

我可能错过了什么?!

【问题讨论】:

  • 可能不相关,但 + ', ' + 是什么意思
  • GIS Api 使用以下内容来定位地图:center: [25, 78]。数字是坐标。
  • 是的,但它是一个数组,所以你为什么需要做 + ', ' + 只是 center: [d.iss_position.latitude, d.iss_position.longitude]

标签: api reactjs


【解决方案1】:

因为在第二个.then 内,您正在返回另一个箭头函数,而不是执行 setState。该函数没有被调用,这就是状态没有更新的原因。

这样写去掉另一个箭头函数:

fetch(url)
    .then(d => d.json())
    .then(d => {
        this.setState({
            center: [....]
        });
    });   
}

另一个问题是getCenter 在您将其作为回调方法传递给 setInterval 时会丢失上下文,因此请在构造函数中绑定该方法:

this.getCenter = this.getCenter.bind(this);

查看有关此语法的详细信息:() =&gt; () =&gt;

What do multiple arrow functions mean in javascript?

【讨论】:

  • 对不起,那是因为我对控制台进行了一些实验。但是,现在我得到了这个Unhandled Rejection (TypeError): _this2.setState is not a function。这太令人沮丧了!顺便提一句。爱你们这么快就给小费!
  • 您收到错误是因为您忘记绑定 getCenter 函数将这一行放入构造函数中:this.getCenter = this.getCenter.bind(this) 它会起作用 :)
  • 是的,这解决了错误!现在没有报错,但是状态还是没有更新……估计会是一个不眠之夜。
  • 使用 setState 回调检查状态是否正在更新,例如:this.setState({ center: [....] }, () =&gt; { console.log(this.state.center); }); 检查值并告诉我结果。
  • 不确定坐标,状态正在获取更新的数据,现在您需要研究格式以及如何显示更新的坐标:)
猜你喜欢
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2021-05-31
相关资源
最近更新 更多