如何在NodeJS中按照优先级值升序执行HTTP请求?
Node.js 按优先级串行发送HTTP请求实现方案
前置说明
os.setPriority是操作系统层面用于调整进程/线程调度优先级的API,和你需要实现的业务逻辑层面的请求执行顺序优先级无关,不要用这个API实现当前需求。
实现思路
- 先预处理请求数组:给没有
priority字段的项默认赋值为1,再按priority数值升序排序 - 按排序后的顺序串行执行请求:每完成一个请求再发起下一个,单个请求的成功/失败不中断后续请求执行
完整可运行代码
// 原生Node.js >= 18 自带fetch,无需安装第三方依赖 const requestArray = [ { url: "http://google.com", priority: 4 }, { url: "http://facebook.com", priority: 1 }, { url: "http://failed.example.gibberish.com", priority: 2 }, // 测试无priority的项 { url: 'http://jsonplaceholder.typicode.com/posts' } ]; async function runPriorityRequests(requests) { // 1. 预处理数组:补全默认优先级 + 排序 const sortedRequests = requests .map(item => { // 缺失priority时默认赋值1 return { ...item, priority: item.priority ?? 1 } }) // 按priority升序排序,数值越小越先执行 .sort((a, b) => a.priority - b.priority); // 2. 串行执行请求 for (const req of sortedRequests) { console.log(`\n开始请求:${req.url},优先级:${req.priority}`); try { const response = await fetch(req.url); // 可根据需要调整响应处理逻辑,比如获取JSON格式返回 const result = await response.text(); console.log(`请求成功,响应长度:${result.length}字节`); } catch (err) { console.log(`请求失败,错误信息:${err.message}`); } } } // 执行函数 runPriorityRequests(requestArray);
关键逻辑说明
- 优先级补全用
??空值合并运算符,只有priority为undefined时才会赋值默认值1,不会覆盖合法的0值等边界情况 - 排序逻辑直接用数值相减实现升序,相同优先级的项会保持原数组中的相对顺序
- 串行执行用
for...of配合await实现,不要用forEach,后者内部的await不会阻塞外层循环,会导致请求并发执行不符合需求 - 每个请求单独用
try/catch包裹,单个请求失败不会中断后续请求的执行,符合无论成败都打印结果的要求
内容的提问来源于stack exchange,提问作者user14872626
相关产品推荐
相关产品推荐

