NodeJS实现函数每2秒循环直至返回结果非空的方法
实现每2秒循环调用直到返回有效值的方案
核心思路是用异步递归+定时器实现循环调用,直到返回的val1、val2、val3全部不为null。下面提供两种适配不同场景的修改封装方案:
方案一:出错时终止重试(保留原错误处理逻辑)
如果API调用出错需要直接返回错误响应,不再继续重试,可使用这个方案:
// 封装循环获取有效数据的异步函数 async function waitForValidData(request_code, res) { try { const theData = await gRating.loadData(request_code); const [val1, val2, val3] = theData; // 检查三个值是否都不为null if (val1 !== null && val2 !== null && val3 !== null) { return theData; // 满足条件,返回有效数据 } // 不满足条件,2秒后再次发起调用 return new Promise(resolve => { setTimeout(() => { resolve(waitForValidData(request_code, res)); }, 2000); }); } catch (ex) { console.error(ex); respondWithError(res, 'API error', 500); throw ex; // 抛出错误终止循环 } } // 替换原代码段,调用封装函数 try { const validData = await waitForValidData(request_code, res); // 拿到有效数据后执行后续业务逻辑 console.log('获取到有效数据:', validData); } catch (ex) { // 可在此处理函数抛出的错误(如API调用失败) }
方案二:出错时继续重试(适配临时异常场景)
如果遇到临时网络波动或服务异常,希望自动重试而非直接终止,可调整异常处理逻辑:
async function waitForValidData(request_code, res) { try { const theData = await gRating.loadData(request_code); const [val1, val2, val3] = theData; if (val1 !== null && val2 !== null && val3 !== null) { return theData; } } catch (ex) { console.error('调用出错,2秒后重试:', ex); } // 无论数据不满足还是调用出错,都2秒后重试 return new Promise(resolve => { setTimeout(() => { resolve(waitForValidData(request_code, res)); }, 2000); }); } // 调用示例 const validData = await waitForValidData(request_code, res); // 处理有效数据
关键细节说明
- 用异步递归替代
setInterval,能确保上一次调用完成后再发起下一次,避免并发请求冲突 - 通过解构返回数组,精准检查三个目标值的状态,满足条件才终止循环
内容的提问来源于stack exchange,提问作者Sizzler
相关产品推荐
相关产品推荐

