当前位置: 首页 > 面试题库 >

如何在react render函数中异步等待?

韦繁
2023-03-14
问题内容

我对async await后端非常熟悉nodejs。但是我遇到了一种情况,我必须在前端使用它。

我正在获取对象的数组,并且在那些对象中我获取lat lng了位置。现在,react-geocode我可以获取单个地名,lat lng但是我想在map函数中使用该名称来获取地名。因此,正如我们所知道的那样,async我必须async await在那边使用。

这是代码

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>
  )
}

但是,当我在此处将map函数与async一起使用时,它不会返回任何内容。谁能帮我解决我的问题?

谢谢!!!


问题答案:

您应该始终将获取数据等关注事项与显示数据等关注事项分开。这里有一个父组件,该组件通过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,则应将这些ID用于键属性而不是数组索引,但是您会发现jist。

更新

同样的事情,但是使用钩子更简单,更短:

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中看起来像这样: 在完成所有这些异步调用之后,我想计算所有数组的最小值。 我要如何等待所有人? 我现在唯一的想法是拥有一个名为done的布尔数组,并在第i个回调函数中将done [i]设置为true,然后说while(不是全部都完成了){} 编辑:我想一个可能但很丑陋的解决方案是在每个回调中编辑完了的数组,然后如果每个回调中都设置了所有其他完成,则调用一个

  • 所以我在Angular中开发了一个新组件,在ngOninit中我有以下异步函数。。。 这getUserProfile需要完成才能调用它。getPrivateGroup()和这个。需要先完成getPrivateGroup(),然后才能调用此函数。loadGroupPosts()。我知道我可以在异步请求的回调中编写这些函数,但我想知道是否有一种方法可以将它保存在ngOnInit中以保持其更干净? 有人

  • 我在中写了这段代码 然后我尝试在另一个文件中使用它 我得到一个错误 “等待仅在异步函数中有效” 问题是什么?

  • 我正试图将图像上传到firebase存储,但调用该函数时,未执行wait以获取url。我错过了什么? 看看这个其他主题,我发现问题可能是“然后”,但我如何设置代码以等待url? 异步/等待/然后飞镖/颤振 谢谢

  • 我试图使一个JSON调用异步/等待使用云函数为Firebase。 你知道如何修复下面的代码吗?我的计划失败了。 我的灵感是https://www.valentinog.com/blog/http-requests-node-js-async-await/ 部署误差 函数[setDetails]:部署错误。 异步URL SyntaxError:对象的createScript(vm.js:56:10)

  • 我的JavaScript代码如下所示: 完成所有这些异步调用后,我想计算所有数组的最小值。 我怎么能等到他们所有人呢? 我现在唯一的想法是有一个布尔数组叫做done,并在第i个回调函数中将done[i]设置为true,然后说while(not all are done){} edit:我想一个可能的,但很难看的解决方案是在每个回调中编辑done数组,然后在每个回调中设置了所有其他done的情况下调