无法同步执行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); });
关键修复点
- 封装fetchData:解决原生
https.get的回调嵌套问题,同时处理了data分段接收的情况(原代码只处理一次data事件,可能导致JSON解析失败)。 - await等待首页请求:确保拿到
totalPage后再生成分页请求,循环能正确执行。 - Promise.all批量处理:同时发起所有分页请求(比逐个等待更高效),等全部完成后统一统计。
- 正确处理async返回值:async函数返回Promise,必须用
.then()或另一个async函数里的await获取结果,不能直接console.log。
内容的提问来源于stack exchange,提问作者Aniket Ghosh
相关产品推荐
相关产品推荐

