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

为何无停止条件的递归执行10-15次后停止?需持续定位刷新

问题原因

你这个递归会停止的核心原因是JavaScript调用栈有最大深度限制。每次调用calcdist时,当前函数的执行上下文会被压入调用栈,虽然你没创建新变量,但递归调用不断积累栈帧,当超过浏览器/JS引擎的栈上限(一般几千到几万层),就会抛出栈溢出错误,导致递归终止。

而且你这里的递归调用calcdist(val)没有加await,虽然函数是async,但这会导致调用栈更快被填满——前一次的calcdist还在等待异步操作,新的调用就已经压栈了,栈帧积累速度远超预期。

解决方案:用定时器实现持续刷新

要实现持续的定位刷新,别用递归,改用setInterval或者带setTimeout的循环,这样每次执行完一轮异步操作后再触发下一次,不会堆积调用栈:

方案一:setInterval 定时执行

async function locagetter() {
  return await Location.getCurrentPositionAsync({enableHighAccuracy: true});
}

async function calcdist() {
  console.log("hoi");
  const val = await locagetter();
  await SetDistance(getPreciseDistance(
    {latitude: 51.493280, longitude: 4.294605 },
    {latitude: val.coords.latitude, longitude: val.coords.longitude}
  ));
}

// 每2秒刷新一次,可根据需求调整间隔
const refreshInterval = setInterval(calcdist, 2000);

// 需要停止刷新时调用:clearInterval(refreshInterval)

方案二:setTimeout 自循环(更灵活)

async function locagetter() {
  return await Location.getCurrentPositionAsync({enableHighAccuracy: true});
}

async function calcdist() {
  console.log("hoi");
  try {
    const val = await locagetter();
    await SetDistance(getPreciseDistance(
      {latitude: 51.493280, longitude: 4.294605 },
      {latitude: val.coords.latitude, longitude: val.coords.longitude}
    ));
  } catch (err) {
    // 捕获定位失败、权限问题等错误,避免循环终止
    console.error("定位或距离计算出错:", err);
  }
  // 当前轮次完成后1秒触发下一次刷新,可调整间隔
  setTimeout(calcdist, 1000);
}

// 启动循环
calcdist();
补充说明
  • 一定要加try/catch,避免某次定位失败(比如用户关闭定位权限)导致整个循环直接终止。
  • 递归天生不适合无限循环场景,它依赖调用栈存储上下文,栈容量有限;而定时器是在事件循环中调度,每次执行完会释放栈资源,不会出现栈溢出问题。

内容的提问来源于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 05:31:33