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

无法同步执行Node.js代码获取目标输出,求异步方案指导

Node.js异步请求统计舒张压数量问题解决

问题核心原因

你的代码根本问题是没搞懂异步操作的执行顺序:

  • https.get是异步任务,代码不会等待它完成就继续往下执行。你发起首页请求拿总页数,但还没拿到totalPage,循环就已经启动了(此时totalPage是undefined,循环直接跳过)。
  • 就算循环能跑起来,所有分页的https.get也是异步的,你直接return count时,所有统计逻辑还没执行,返回的永远是初始值0。

关键工具简单解释

Promise

把异步任务包装成一个"承诺",任务完成时会返回结果(成功/失败)。可以把回调式的异步操作(比如https.get)转成Promise,方便控制流程。

async/await

Promise的语法糖,让异步代码看起来像同步代码一样顺序执行。async标记的函数里可以用await,它会暂停代码执行,直到Promise完成,拿到结果后再继续。

修复后的代码

const https = require("https");

// 把https.get封装成Promise函数,方便用await等待结果
function fetchData(url) {
  return new Promise((resolve, reject) => {
    https.get(url, (res) => {
      let data = "";
      // 注意:res.on('data')可能多次触发,需要拼接所有数据片段
      res.on("data", (chunk) => {
        data += chunk;
      });
      res.on("end", () => {
        try {
          const parsedData = JSON.parse(data);
          resolve(parsedData);
        } catch (err) {
          reject(err);
        }
      });
    }).on("error", (err) => {
      reject(err);
    });
  });
}

async function myfunc(lowerlimit, upperlimit) {
  let count = 0;
  const baseUrl = "https://jsonmock.hackerrank.com/api/medical_records";

  // 第一步:先请求首页,拿到总页数
  const firstPageData = await fetchData(baseUrl);
  const totalPage = firstPageData.total_pages;

  // 第二步:生成所有分页的请求Promise
  const pagePromises = [];
  for (let i = 1; i <= totalPage; i++) {
    const pageUrl = `${baseUrl}?page=${i}`;
    pagePromises.push(fetchData(pageUrl));
  }

  // 第三步:等待所有分页请求完成,统一统计数据
  const allPagesData = await Promise.all(pagePromises);
  allPagesData.forEach(pageData => {
    pageData.data.forEach(record => {
      const diastolic = record.vitals.bloodPressureDiastole;
      if (diastolic >= lowerlimit && diastolic <= upperlimit) {
        count++;
      }
    });
  });

  return count;
}

// async函数返回Promise,用then获取结果
myfunc(80, 200).then(result => {
  console.log(result);
}).catch(err => {
  console.error("请求出错:", err);
});

关键修复点

  1. 封装fetchData:解决原生https.get的回调嵌套问题,同时处理了data分段接收的情况(原代码只处理一次data事件,可能导致JSON解析失败)。
  2. await等待首页请求:确保拿到totalPage后再生成分页请求,循环能正确执行。
  3. Promise.all批量处理:同时发起所有分页请求(比逐个等待更高效),等全部完成后统一统计。
  4. 正确处理async返回值:async函数返回Promise,必须用.then()或另一个async函数里的await获取结果,不能直接console.log。

内容的提问来源于stack exchange,提问作者Aniket Ghosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:20:28