如何从多组axios GET请求返回Promise并实现并行调用?
问题解决方法
你犯了一个没必要的错误:async函数本身就会自动返回Promise,完全不需要手动用new Promise包裹内部逻辑。你之前的报错,是因为在new Promise的回调函数(非async)里用了await,这才触发语法错误。
正确的修改方案
- 保留原
getData的async函数逻辑,不需要加外层的new Promise,它本身返回的就是Promise。 - 你的期望
main函数写法是对的,直接收集getData返回的Promise即可实现并行请求。
完整正确代码
getData函数(无需修改核心逻辑,仅优化错误处理)
async function getData(dataURI) { let getURI = dataURI; const config = { headers: { Authorization: `Bearer ${my-token-text}`, }, }; var finalData = []; // 循环请求直到没有nextLink while (getURI != null) { try { const getResult = await axios.get(getURI, config); if (getResult.status === 200) { const receivedData = getResult.data.value; finalData.push(...receivedData); // 检查是否有下一页链接 if (Object.prototype.hasOwnProperty.call(getResult.data, 'nextLink')) { getURI = getResult.data.nextLink; } else { getURI = null; return finalData; } } } catch (err) { console.error('请求出错:', err); // 抛出错误让Promise.allSettled捕获失败状态 throw err; // 若想返回已获取的部分数据,可替换为: // break; } } return finalData.length > 0 ? finalData : null; }
main函数(实现并行请求)
async function main() { const promisesArray = []; const URL_1 = 'abc.com/get1/data1'; promisesArray.push(getData(URL_1)); const URL_2 = 'abc.com/get2/data2'; promisesArray.push(getData(URL_2)); const results = await Promise.allSettled(promisesArray); console.log('所有请求完成: ', results); // 可遍历结果区分成功/失败 results.forEach((result, index) => { if (result.status === 'fulfilled') { console.log(`请求${index+1}成功:`, result.value); } else { console.log(`请求${index+1}失败:`, result.reason); } }); }
并行原理说明
- 调用
getData(URL_1)时,函数会立即执行并发起第一个axios请求,同时返回一个Promise。 - 紧接着调用
getData(URL_2),同样立即执行并发起第二个请求,两个请求会并行处理。 Promise.allSettled会等待所有Promise完成(无论成功或失败),然后统一返回结果数组。
内容的提问来源于stack exchange,提问作者User7723337
相关产品推荐
相关产品推荐

