【问题标题】:Running a function when it's previous function completes in React/React Native在 React/React Native 中完成前一个函数时运行一个函数
【发布时间】:2021-11-06 20:58:14
【问题描述】:

我有 2 个函数,我想一个接一个地运行,但是由于第二个函数从前一个函数中创建的状态中获取信息,我希望它在执行之前等待它完成。

我知道 async/await 可能是这方面的最佳选择,但还没有完全掌握它。

第一个函数实质上是从一组数据中获取最近的位置,并将状态设置为该数据中的第一项,然后第二个函数将地图从前一个函数的纬度/经度移动到该位置。

这是我目前的代码:

  const nearestPod = () => {
    let newArr = [];
    let closest = [];

    data.map(item => newArr.push(item.distance));
    newArr.sort(function (a, b) {
      return a - b;
    });

    data.map(item => item.distance == newArr[0] && closest.push(item));
    setClosestPod(closest);

    setNearestActive(true);
    moveToNearestPod();
  };

  const moveToNearestPod = async () => {
    await nearestPod();
    let lat = closestPod[0].lat;
    let lng = closestPod[0].lng;

    setLat(lat);
    setLng(lng);
  };

此功能确实有效,但仅在第二次单击时才会向我抛出 Promise Rejection 警告,所以我感觉我快要做到了,但如果有人能提供一些专业知识,让我知道前进的最佳实践,我将不胜感激!

提前致谢。

【问题讨论】:

    标签: javascript reactjs react-native async-await promise


    【解决方案1】:

    这些都不需要async。但是 React 会分批排队和处理状态更新,因此您需要使用 useEffect 来获取这些状态更改的更改,然后设置您的 lat/lng 状态。

    注意:map 创建了一个新数组,因此您不需要事先声明您的数组(否则使用forEach)。而且,第二个示例可能应该使用find。它将返回一个符合条件的对象。

    function nearestPod() {
    
      const newArr = data.map(item => item.distance);
    
      newArr.sort((a, b) => a - b);
    
      const closest = data.find(item => item.distance === newArr[0]);
    
      setClosestPod(closest);
      setNearestActive(true);
    
    };
    
    useEffect(() => {
      let lat = closestPod.lat;
      let lng = closestPod.lng;
      setLat(lat);
      setLng(lng);
    }, [closestPod]);

    【讨论】:

    • 这很棒,正是我所需要的,感觉我从它的干净程度中学到了很多。我唯一改变的是第二个函数,'closest' 必须是 'closestPod' 我相信它是从 setClosestPod 状态获得的?它很有魅力
    猜你喜欢
    • 2016-04-11
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多