如何遍历多个HTTP请求并等待循环结束后再解析Promise?
问题分析与解决方案
我来帮你拆解下当前代码的问题,然后给出针对性的修复方案:
问题根源
你的代码里有两个核心问题导致Promise提前resolve:
map不等待异步操作:questionArr.map()只是遍历数组并返回新的数组,但它不会等待每个回调里的异步请求完成。你虽然在Promise构造函数里加了async,但并没有实际等待这些请求结束。- 没有等待
globalApi.post完成:globalApi.post是异步操作,你没有用await它,所以这些请求会在后台默默执行,而你的代码直接跳到了resolve(true)。
修复方案
我们需要确保所有异步请求都完成后再resolve Promise,这里有两种简洁的实现方式:
方式1:修正原Promise写法
export const sendQuestionArray = (questionArr) => { return new Promise(async(resolve, reject) => { try { // 收集所有请求的Promise,用Promise.all等待全部完成 await Promise.all(questionArr.map(async(question) => { const formSend = new FormData() formSend.append('idAsignacion', question.question_id) formSend.append('pregunta', question.question) formSend.append('respuesta', question.value ? 'CUMPLE' : 'NO_CUMPLE') formSend.append('imagenes', JSON.stringify(question.photo)) formSend.append('comments', question.comments) // 等待当前请求完成 await globalApi.post('/api-agv/audit/set_answer_audit', formSend) })) // 所有请求都成功完成后再resolve resolve(true) } catch (error) { // 捕获任何请求失败的错误,传递给调用方 reject(error) } }) }
方式2:简化为async函数(更推荐)
因为async函数本身就会返回Promise,所以不需要手动创建new Promise,代码会更简洁易读:
export const sendQuestionArray = async(questionArr) => { try { // 等待所有请求全部完成 await Promise.all(questionArr.map(async(question) => { const formSend = new FormData() formSend.append('idAsignacion', question.question_id) formSend.append('pregunta', question.question) formSend.append('respuesta', question.value ? 'CUMPLE' : 'NO_CUMPLE') formSend.append('imagenes', JSON.stringify(question.photo)) formSend.append('comments', question.comments) await globalApi.post('/api-agv/audit/set_answer_audit', formSend) })) // 所有请求成功后返回true return true } catch (error) { // 抛出错误,让调用方可以通过try/catch处理 throw error } }
关键说明
Promise.all的作用:它会接收一个Promise数组,等待数组中所有Promise都成功resolve后才会继续执行;如果有任何一个Promise reject,它会立即抛出错误。- 每个map回调加
async/await:确保每个globalApi.post请求都完成后,才会生成对应的Promise结果。 - 错误处理:通过
try/catch捕获请求过程中的错误,避免某个请求失败导致整个流程无响应,同时把错误传递给调用方处理。
内容的提问来源于stack exchange,提问作者Gario3
相关产品推荐
相关产品推荐

