为何无停止条件的递归执行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
相关产品推荐
相关产品推荐

