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

Node.js异步循环终止:多GET请求匹配内容即停止

解决Node.js中异步GET请求循环的问题

嘿,刚上手JavaScript和Node.js就尝试这种异步循环场景,已经很赞啦!你遇到的核心问题是同步循环和异步回调的执行顺序冲突——普通的while循环是同步跑的,会瞬间把所有请求都发出去,完全不会等回调函数返回结果,所以你靠page==5终止循环只是临时办法,真正找到目标时根本没法及时停下。

我来帮你把代码改成符合异步逻辑的写法,用现在Node.js里最清晰的async/await方案,一步步来:

首先理解原代码的问题

  1. while(notFound)是同步循环,会一口气把page从1加到N,所有请求同时发出去,根本等不到回调里修改notFound
  2. res.on('data')只处理了单次数据块,HTTP响应可能分多次返回,直接解析会导致JSON报错
  3. 全局变量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);
  });

代码关键改进点

  1. getPage函数:把原生回调式的https.get转成Promise,解决了数据分块和JSON解析的问题,确保拿到完整的响应数据
  2. 异步循环逻辑:用while(true)配合await,让循环等待每个请求完成后再执行下一步,找到目标就直接return终止循环
  3. 边界处理:根据接口返回的total_pages判断是否还有下一页,避免无限循环;同时捕获请求错误,防止程序崩溃
  4. 无全局变量:所有状态都在函数内部管理,逻辑更安全可控

这样写的异步代码和同步逻辑一样直观,新手更容易理解,而且能精准在找到目标时终止循环,不会浪费资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:22:41