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

如何用async/await实现可等待完成的递归距离计算函数?

问题分析与修复方案

你的代码核心问题有两个:

  • 递归调用时未使用await,导致每次递归产生的Promise未被处理,触发「Possible Unhandled Promise Rejection」错误
  • 部分异步函数调用缺失await,无法获取实际计算结果,且没有错误捕获机制处理异步操作异常

正确实现方式

要确保所有异步操作都用await等待完成,递归调用必须加await,同时用try/catch捕获异步异常,另外建议增加终止条件避免无限递归。

// 外部状态控制递归是否继续
let shouldContinue = true;

const calculateDistance = async () => {
  if (!shouldContinue) return; // 终止递归的条件
  try {
    // 等待获取当前位置
    const loc = await Location.getCurrentPositionAsync({enableHighAccuracy: true});
    // 等待距离计算完成(假设getPreciseDistance是异步函数)
    const distanceCalc = await getPreciseDistance(
      {latitude: 51.493280, longitude: 4.294605 },
      {latitude: loc.coords.latitude, longitude: loc.coords.longitude}
    );
    // 等待distance状态更新完成(假设SetDistance是异步函数)
    await SetDistance(distanceCalc);
    // 递归调用必须加await,确保Promise被处理
    await calculateDistance();
  } catch (error) {
    // 捕获所有异步错误,避免未处理的Promise拒绝
    console.error('计算距离出错:', error);
    // 可选:出错后延迟重试
    setTimeout(() => calculateDistance(), 3000);
  }
};

// 启动递归
calculateDistance();

// 如需停止递归,执行:shouldContinue = false;

关键修复点说明

  • 递归调用添加await,确保每次递归的异步操作被正确追踪,不会产生未处理Promise
  • 用try/catch包裹所有异步步骤,捕获获取位置、计算距离、更新状态过程中的异常
  • 增加shouldContinue终止条件,避免无限递归引发性能问题
  • 所有返回Promise的函数都用await等待,保证拿到实际结果而非Promise对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:45:33