javascript - 如何在 React 渲染函数中异步等待?

标签 javascript reactjs asynchronous promise async-await

我非常熟悉async wait,但也熟悉后端nodejs。但我遇到了一个场景,我必须在前端使用它。

我正在获取对象数组,并且在该对象中我获取了地点的lat lng。现在使用 react-geocode 我可以获取单个 lat lng 的地名,但我想在 map 函数内使用它来获取地名。所以我们知道它的 async 调用我必须在那里使用 async wait

这是代码

import Geocode from "react-geocode";
render = async() => {
  const {
    phase,
    getCompanyUserRidesData
  } = this.props   
                      
  return (
    <div>
       <tbody>                   
        await Promise.all(_.get(this.props, 'getCompanyUserRidesData', []).map(async(userRides,index) => {
          const address = await Geocode.fromLatLng(22.685131,75.873468)
          console.log(address.results[0].formatted_address)                         
         return ( 
          <tr key={index}>
            <td>
            {address.results[0].formatted_address}
            </td>
            <td>Goa</td>
            <td>asdsad</td>
            <td>{_.get(userRides,'driverId.email', '')}</td>
            <td>{_.get(userRides,'driverId.mobile', '')}</td>
          </tr>
        )
        }))
      </tbody>
    </div>
  )
}

但是当我在这里将 async 与 map 函数一起使用时,它不会返回任何内容。谁能帮助我哪里出错了?

最佳答案

您应该始终将获取数据之类的关注点与显示数据之类的关注点分开。这里有一个父组件,它通过 AJAX 获取数据,然后在数据传入时有条件地渲染纯功能子组件。

class ParentThatFetches extends React.Component {
  constructor () {
    this.state = {};
  }

  componentDidMount () {
    fetch('/some/async/data')
      .then(resp => resp.json())
      .then(data => this.setState({data}));
  }

  render () {
    {this.state.data && (
      <Child data={this.state.data} />
    )}
  }
}

const Child = ({data}) => (
  <tr>
    {data.map((x, i) => (<td key={i}>{x}</td>))}
  </tr>
);

我实际上并没有运行它,所以它们可能是一些小错误,如果您的数据记录具有唯一的 id,您应该使用它们作为键属性而不是数组索引,但您得到了要点。

更新

同样的事情,但使用钩子(Hook)更简单、更短:

const ParentThatFetches = () => {
  const [data, updateData] = useState();
  useEffect(() => {
    const getData = async () => {
      const resp = await fetch('some/url');
      const json = await resp.json()
      updateData(json);
    }
    getData();
  }, []);

  return data && <Child data={data} />
}

关于javascript - 如何在 React 渲染函数中异步等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53819864/

相关文章:

javascript securty : an AJAX call to record the user's screen resolution, 是否可以防止假号码?

node.js - Fluxible 中的“脱水”和“再水合”代表什么?

javascript - 如何让 Grunt 在运行另一个任务之前等待一个任务完成?

java - 主线程在 CompletableFuture 完成之前退出

javascript - 浏览器后退按钮不会保存数据表中使用的表中的分页历史记录

javascript - 为什么在 Jquery 中添加 "blocker"类后我的事件绑定(bind)不再触发?

reactjs - React Native 中的 React.addons

reactjs - 用于 react 的 Powerpoint 查看器?

node.js - ModeMongoose 的异步/等待与 Mongoose Deep Populate 链

javascript - 调用变量中命名的 jQuery 函数