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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:15:48