(React & Mobx & Leaflet) await 然后没有像我预期的那样工作

(React & Mobx & Leaflet) await and then are not working as I expected

晚上好。

此组件的目的是创建一个从 observable curentLocation 获取数据的地图。 useEffect() 中的 loadInitialLocation()newMap() 只应调用一次,而 autorun() 中的 updateMap() 会在 obrservable curentLocation 更改时调用。

问题是:在 loadInitialLocation() 完成其从服务器获取数据并将结果加载到 observable curentLocation 的工作之前,不应调用 newMap()。现在 newMap()obrservable curentLocation 为 null 时被调用。

我在 useEffect() 中试过这个:

useEffect(() => {
    loadInitialLocation().then(newMap());
  }, []);

其中 constant loadInitialLocation:() => Promise<void>。我预计“newMap() 只有在 loadInitialLocation() 完成后才会 运行”。

我也在 useEffect() 中尝试过这个:

useEffect(() => {
    const getCurLoc = async () => {
      await loadInitialLocation();
      newMap();
    }
    getCurLoc();
  }, []);

还有这个:

useEffect(() => {
    loadInitialLocation().then(newMap());
    autorun(() => {
      console.log("autorun here")
      updateMap();
    });
  }, []);

商店:

@observable currentLocation: ILocation | null = null;
@action loadInitialLocation = async () => {
      try {
        const currentLocation = await agent.Adventure.locationDetails();
        runInAction(() => {
          this.currentLocation = currentLocation;
          console.log("load currentLocation")
        });
      } catch (error) {
        throw error;
      }
    }
  };

组件:

const LeafletMap: React.FC = () => {
  var map: L.Map;
  const tilePixelSize = 32;
  const rootStore = useContext(RootStoreContext);
  const { openModal } = rootStore.modalStore;
  const { currentLocation, loadInitialLocation } = rootStore.mapStore;

  useEffect(() => {
    loadInitialLocation().then(newMap());
  }, []);

  autorun(() => {
    console.log("autorun here")
    updateMap();
  });

  const newMap = () => {
    if (currentLocation == null) {
      console.log("null currentLocation");
      return null;
    }
    // code
    // use currentLocation to load the initial map

    console.log("successfully init map");
  };

  const updateMap = () => {
    if (map == undefined) {
      return null;
    }
    console.log("update map");
    // code
  };
  console.log("add to dom");
  return <div id="map"></div>;
};

export default observer(LeafletMap);

如果我移动到任何其他页面并返回此页面,地图将被正确加载。我认为这是因为 oberservable currentLocation 已加载,因此 newMap() 不会到达 if (currentLocation == null) 和 return null.

如何确保 loadInitialLocation() 完成后只有 运行s newMap()?我是不是没有正确使用 async、await 和然后?

我没有使用正确的方式调用newMap()

正确的做法应该是:

useEffect(() => {
    loadInitialLocation().then(() => newMap());
  }, []);

由此,我们可以确保只有当我们从 mobx 操作中获得预期结果时,我们才能执行“然后”。

useEffect(() => {
    loadInitialLocation().then((result) => {
      if (result) {
        newMap(result);
      }
    });
  }, [loadInitialLocation])