是否可以使用react.js将promise数据值分配给外部变量

时间:2018-05-11 11:07:27

标签: javascript reactjs

是否有可能将promise数据值分配给外部变量?

我想做类似的事情:

export default class LocationSearchInput extends Component {
constructor(props) {
    super(props);
    this.state = {address: ''}
}

handleChange = (address) => {
    this.setState({ address });
};

handleSelect = (address) => {
    geocodeByAddress(address)
        .then(results => getLatLng(results[0]))
        .then(latLng => console.log(latLng))
        .catch(error => console.error('Error', error));
};
render() { ........

在这个例子中,我得到了我想要的东西:latLng,但我不能在外面使用它。它在SearchBox.js文件中我希望将它包含在另一个Map.js文件中。我是新手,非常感谢!

2 个答案:

答案 0 :(得分:0)

处理这种情况的最佳方法是在topMost父项中有一个函数,需要使用latLng并让它调用API并将LatLng保存在状态并传递此值作为LocationSearchInput和其他需要它的组件的道具

class Parent extends React.Component {
  handleGeocodeByAddress(address) {
     geocodeByAddress(address)
        .then(results => getLatLng(results[0]))
        .then(latLng => this.setState({ latLng }))
        .catch(error => console.error('Error', error));
  }
  render() {
     return <Child layLng={this.state.latLng} handleGeocodeByAddress={handleGeocodeByAddress} />
  }
}

并从子

调用父函数
export default class LocationSearchInput extends Component {

    constructor(props) {
        super(props);
        this.state = {address: ''}
    }

    handleChange = (address) => {
        this.setState({ address });
    };

    handleSelect = (address) => {
        this.props.handleGeocodeByAddress(address);
    };
    render() { ........

答案 1 :(得分:-1)

最简单的方法是将latLng存储在全局window对象上,如下所示:

window.latLng = latLng;

然后,您可以Map.js访问window.latLng,然后使用latLng

然而,这不是一个很好的做法。它污染了您的全局对象(虽然使用命名空间在某种程度上缓解了这种情况)并且由于您异步检索Map.js,因此当latLng代码尝试访问它时,该变量可能不可用。

处理此问题的更好方法是将Map.js值传递给父组件,然后将其移回Map.js所需的位置。您还可以发出事件并从public UserControl1() { InitializeComponent(); this.Loaded += UserControl1_Loaded; } void UserControl1_Loaded(object sender, RoutedEventArgs e) { Window window = Window.GetWindow(this); window.Closing += window_Closing; } void window_Closing(object sender, global::System.ComponentModel.CancelEventArgs e) { //Save your settings here }

中捕获它