当前位置: 首页 > 知识库问答 >
问题:

反应-无法在promise内设置状态

柴丰
2023-03-14

我试图在promise的then()内设置状态,但状态值未保存,在then()外无法访问。

以下是更新后的代码:

handleSelect = location => {
  this.setState({ location });
  geocodeByAddress(
    location
  )
  .then(results => getLatLng(results[0]))
  .then(latLng => {
    this.setState({
      location_latitude: latLng.lat,
      location_longitude: latLng.lng,
    })
    console.log(this.state.location_latitude); // returns the correct value
  })
  console.log(this.state.location_latitude); // returns null (the originally declared value)
}

如果我console.log(this.state.location_latitude)我得到一个null值。但是,如果我console.log在那么()块,我得到正确的值。在这种情况下如何设置状态?

更新的说明:

为了给整个逻辑提供更好的上下文:我使用了一个GooglePlacesAutoComplete组件,它允许用户从下拉列表中选择一个位置。当用户从下拉列表中选择位置时,将调用上述方法handleSelect。然后,我使用geocodeByAddress方法提取用户选择的地点的纬度和经度,这是一个promise。然后,我需要检索纬度和经度,并相应地设置状态,稍后用于发送到数据库。我还不能将值提交到数据库,因为用户需要填写其他表单输入(也存储在状态中),一旦他单击submit,我将在一次对后端的调用中提交所有状态元素。因此,我不想使用componentDidMount()更新任何内容,也不想使用componentdiddupdate()更新任何内容。在任何情况下,我只能将状态值存储在geocodeByAddress的then中(如果我在这里出错,请更正)。因此,我必须能够修改然后块中的状态值。


共有2个答案

昌学
2023-03-14

您需要将函数上下文绑定到当前类/组件。试试下面的方法。创建一个像“callSetState”这样的函数,将其与此绑定,并在调用时将值作为参数传递给它。

import React, { Component } from 'react';
class Test extends Component{
    constructor() {
        super()
        this.callSetState = this.callSetState.bind(this);
    }

    callSetState(latitude, longitude) { 
        this.setState({
            location_latitude: latitude,
            location_longitude: longitude,
        })
    }

/* Call this func in your class and call callSetState which is already bound to your component in constructor */

    // geocodeByAddress(location)
    //     .then(results => getLatLng(results[0]))
    //     .then(latLng => this.callSetState(latLng.lat, latLng.lng));

}
蒋奕
2023-03-14

问题是,当您设置状态时,您无法立即看到状态结果。这就是为什么console.log返回null。确保您的控制台.log位于渲染块中。这是因为设置状态操作是异步的,并且是为了提高性能而批处理的。setState的文档中对此进行了解释。看看这个=

 类似资料:
  • 问题内容: 我正在创建一个简单的聊天应用程序,在其中我通过axios对数据库进行api调用,该API返回了一系列消息对象。我可以在componentWillMount中进行axios调用时获取数据。然后,我试图设置状态以显示对话。这是代码: 我看过一些有关生命周期功能和设置状态的帖子,似乎我在做正确的事情。 再次强调,axios调用正常,设置状态不正常。我仍然看到一个空数组。提前致谢! 编辑:这是

  • 首先,我尝试了这个线程上的每一个答案:如何在iOS7中更改状态栏文本颜色,但我无法让状态栏显示白色文本。 在应用程序启动时,文本在加载到我的根视图控制器之前显示为白色。我认为问题在于,我的根视图控制器设置为不显示状态栏(我想要的),但其他每个视图都需要显示它。 当我转到第二个视图时,我看到状态栏文本从白色闪烁到黑色。 我已尝试在AppDelegate中将状态栏设置为亮起。 我已经尝试在rootVi

  • 我有一个处理程序,在输入字段发生变化时触发。但是,当我将状态日志记录到控制台resData是'未定义'?这是不可能的,因为console.log(身体)确实返回结果。

  • 做一个简单的井字游戏。我尝试在鼠标进入时突出显示单个单元格,然后在鼠标离开时恢复正常-使用状态和内联样式来完成这一点。状态在鼠标进入时变化很好(样式也是如此),但在鼠标离开时不会恢复正常。我在这里错过了什么?

  • 是否有方法将defaultValue传递给状态?我也尝试了value={},但值根本不变。

  • 基本React Web应用程序 应用: 使用onMouseEnter和onmouseLeave呈现出与悬停按钮的联系。 问题: 无法更改悬停状态 附加: 如何在团队常量内将悬停状态从true更改为false?我刚反应过来。 我明白改变状态的简单方法,但这对我来说有点复杂。