Node.js18中Fetch调用CurseForge API的异步执行顺序问题
解决Node.js中fetch异步请求导致执行顺序异常的问题
问题核心是异步操作未被正确等待,forEach这类循环不会处理异步函数的等待逻辑,导致后续代码提前执行。以下是两种可靠的解决方式:
方式一:逐个串行请求(严格顺序输出)
适合需要严格按照模组ID顺序输出名称的场景,每个请求完成后再发起下一个:
const modIds = [123, 456, 789]; // 替换为你的模组ID列表 const API_KEY = '你的CurseForge API密钥'; // 封装单个模组名称的获取函数 async function getModName(modId) { const response = await fetch(`https://api.curseforge.com/v1/mods/${modId}`, { headers: { 'x-api-key': API_KEY } }); if (!response.ok) { throw new Error(`请求模组${modId}失败: ${response.status}`); } const data = await response.json(); return data.data.name; } // 主处理函数 async function processMods() { try { // 使用for...of循环逐个等待异步操作完成 for (const id of modIds) { const name = await getModName(id); console.log(name); } // 所有请求完成后再输出提示 console.log("download finished"); } catch (err) { console.error('处理出错:', err); } } // 启动执行 processMods();
方式二:并行请求后统一输出(效率更高)
如果不需要严格的请求顺序,只是要等所有请求完成后再输出名称和提示,用Promise.all并行发起所有请求,效率更高:
const modIds = [123, 456, 789]; const API_KEY = '你的CurseForge API密钥'; async function getModName(modId) { const response = await fetch(`https://api.curseforge.com/v1/mods/${modId}`, { headers: { 'x-api-key': API_KEY } }); if (!response.ok) { throw new Error(`请求模组${modId}失败: ${response.status}`); } const data = await response.json(); return data.data.name; } async function processMods() { try { // 并行发起所有请求,等待全部完成 const modNames = await Promise.all(modIds.map(id => getModName(id))); // 统一输出所有模组名称 modNames.forEach(name => console.log(name)); console.log("download finished"); } catch (err) { console.error('处理出错:', err); } } processMods();
原代码出错原因
你之前的代码大概率使用了forEach循环调用异步的fetch函数——forEach不会等待异步函数执行完成,循环会直接走完,主线程随即执行后续的console.log("download finished"),而此时fetch请求还在后台处理,所以会先输出提示,后输出模组名称。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

