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
相关产品推荐
相关产品推荐

