Node.js异步循环终止:多GET请求匹配内容即停止
解决Node.js中异步GET请求循环的问题
嘿,刚上手JavaScript和Node.js就尝试这种异步循环场景,已经很赞啦!你遇到的核心问题是同步循环和异步回调的执行顺序冲突——普通的while循环是同步跑的,会瞬间把所有请求都发出去,完全不会等回调函数返回结果,所以你靠page==5终止循环只是临时办法,真正找到目标时根本没法及时停下。
我来帮你把代码改成符合异步逻辑的写法,用现在Node.js里最清晰的async/await方案,一步步来:
首先理解原代码的问题
while(notFound)是同步循环,会一口气把page从1加到N,所有请求同时发出去,根本等不到回调里修改notFoundres.on('data')只处理了单次数据块,HTTP响应可能分多次返回,直接解析会导致JSON报错- 全局变量
notFound、page容易引发意外的逻辑问题
解决方案:用Promise+async/await封装异步请求
我们先把https.get封装成返回Promise的函数,这样就能用await让循环等待每个请求完成,再决定是否继续:
const https = require('https'); // 封装HTTP GET请求为Promise,处理数据拼接和JSON解析 function getPage(url) { return new Promise((resolve, reject) => { https.get(url, (res) => { let data = ''; // 拼接所有分块返回的数据 res.on('data', (chunk) => { data += chunk; }); // 响应结束后解析完整的JSON数据 res.on('end', () => { try { const result = JSON.parse(data); resolve(result); } catch (err) { reject(new Error(`解析JSON失败:${err.message}`)); } }); }).on('error', (err) => { reject(new Error(`请求失败:${err.message}`)); }); }); } // 异步函数处理循环搜索逻辑 async function findCountryByCode(targetCode) { let page = 1; const baseUrl = "https://jsonmock.hackerrank.com/api/countries?page="; while (true) { console.log(`正在请求第 ${page} 页`); try { const response = await getPage(`${baseUrl}${page}`); // 遍历当前页的国家数据 for (const country of response.data) { console.log(`当前国家:${country.name}`); if (country.alpha2Code === targetCode) { console.log(`### FOUND ### - ${country.name}`); return country; // 找到目标,直接终止函数和循环 } } // 检查是否还有下一页,避免无限循环 if (page >= response.total_pages) { console.log(`遍历完所有页面,未找到代码为${targetCode}的国家`); return null; } page++; } catch (err) { console.error(`请求第${page}页失败:`, err.message); page++; // 出错后继续尝试下一页,也可以根据需求终止循环 } } } // 启动搜索并处理结果 findCountryByCode('AF') .then(result => { console.log("搜索完成,最终结果:", result); process.exit(); // 找到结果后结束程序 }) .catch(err => { console.error("搜索过程出错:", err.message); process.exit(1); });
代码关键改进点
getPage函数:把原生回调式的https.get转成Promise,解决了数据分块和JSON解析的问题,确保拿到完整的响应数据- 异步循环逻辑:用
while(true)配合await,让循环等待每个请求完成后再执行下一步,找到目标就直接return终止循环 - 边界处理:根据接口返回的
total_pages判断是否还有下一页,避免无限循环;同时捕获请求错误,防止程序崩溃 - 无全局变量:所有状态都在函数内部管理,逻辑更安全可控
这样写的异步代码和同步逻辑一样直观,新手更容易理解,而且能精准在找到目标时终止循环,不会浪费资源。
内容的提问来源于stack exchange,提问作者anoop
相关产品推荐
相关产品推荐

