You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中Async函数未等待执行结果就运行后续代码如何解决

核心问题

你当前的waitForLoc函数虽然标记了async,但没有把回调风格的navigator.geolocation.getCurrentPosition包装为Promise,导致函数不等定位回调执行就直接返回,后续路径规划函数触发时还没有拿到正确的用户坐标,自然达不到想要的执行顺序。

改造代码

1. 重写定位函数,适配async/await逻辑

async function waitForLoc(){
  return new Promise((resolve, reject) => {
    if(!navigator.geolocation){
      reject(new Error("当前环境不支持地理定位"));
      return;
    }
    // 定位成功触发resolve,失败触发reject
    navigator.geolocation.getCurrentPosition(
      position => {
        const latUser = position.coords.latitude;
        const lngUser = position.coords.longitude;
        L.marker([latUser, lngUser]).addTo(mymap);
        // 返回用户坐标,避免依赖全局变量
        resolve({latUser, lngUser});
      },
      err => reject(err)
    )
  })
}

2. 调整执行顺序,保证定位完成后再做路径规划

const lat = coordinates[1];
const lng = coordinates[0];
let Route = null;

async function planRoute(userLat, userLng) {
  // 原有1秒延时如果是为了等定位,现在可以直接删除
  // await new Promise(resolve => setTimeout(resolve, 1000));

  if(Route) mymap.removeControl(Route);

  Route = L.Routing.control({
    waypoints: [
      L.latLng(userLat, userLng),
      L.latLng(lat, lng)
    ],
    routeWhileDragging: false
  }).addTo(mymap);

  mymap.closePopup();
}

// 按顺序执行
waitForLoc()
.then(userCoord => planRoute(userCoord.latUser, userCoord.lngUser))
.catch(err => console.error("执行出错:", err));

注意事项

  • 改写后不需要依赖全局变量存储用户坐标,避免了变量未赋值就被调用的问题
  • 新增的错误捕获可以处理用户拒绝定位授权、定位失败等异常场景,避免代码直接崩溃
  • 如果原有1秒延时是其他业务需要,可以保留,不影响执行顺序

内容的提问来源于stack exchange,提问作者whitek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:45:08