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

NodeJS如何批量处理HTTPS请求并等待全部完成后过滤可访问URL

问题原因

Array.prototype.forEach 不会处理异步回调返回的Promise,你传入的async回调返回的Promise没有被收集等待,外层await实际等待的是undefined,所以函数会直接返回未填充的空数组,所有检测请求都是在函数返回后才陆续执行完成的。

解决方案

使用Promise.all批量等待所有异步检测任务完成,同时优化checkurl逻辑去除对外部变量的依赖,完整实现代码如下:

const https = require("https");

async function checkurl(url) {
  return new Promise((resolve) => {
    const req = https.get(url, (res) => {
      console.log("RESPONSE! StatusCode: " + res.statusCode);
      resolve(res.statusCode < 400 ? url : null);
      // 销毁响应避免内存泄漏
      res.destroy();
    });
    req.on("error", (e) => {
      console.log(e);
      resolve(null);
    });
    // 可选:添加3秒超时避免长时间无响应
    req.setTimeout(3000, () => {
      req.destroy();
      resolve(null);
    });
  });
}

async function filterUrls(urlArray) {
  // 批量生成所有检测任务的Promise
  const allCheckTasks = urlArray.map(url => checkurl(url));
  // 等待所有检测任务执行完成
  const checkResults = await Promise.all(allCheckTasks);
  // 过滤掉无效的null值,得到有效URL数组
  return checkResults.filter(Boolean);
}

const urls = [
  "https://google.com",
  "https://youtube.com",
  "https://microsoft.com",
  "https://filterUrlsle.com",
];

async function app() {
  console.log("begin");
  const result = await filterUrls(urls);
  console.log(result);
  console.log("continue");
}

app();

实现说明

  • 所有检测请求并发执行,效率远高于串行遍历等待
  • 单个URL检测失败不会中断整体流程,错误会正常打印同时返回null占位
  • 没有额外外部依赖,逻辑简洁易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:08