如何用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
相关产品推荐
相关产品推荐

