React中Promise.all未等待所有Promise完成就执行页面刷新问题
问题分析与解决
你的代码核心问题在于Papa.parse是异步执行的,complete回调会在文件解析完成后才触发,但你在调用Papa.parse后立刻就执行了await Promise.all(promises)——这时候promises数组还是空的,所以Promise.all直接完成,页面提前刷新,后续解析完成后才发起的axios请求还没执行完就被页面刷新中断了。
修复步骤
把Papa.parse包装成Promise,让async函数等待文件解析完成后再收集请求promise,最后统一等待所有请求完成:
async function beginpost() { const APIURL = 'http://localhost:8080/new'; // 用const避免全局变量污染 const files = e.target.files; if (!files) return; // 把Papa.parse包装成Promise,等待文件解析完成 const parseResult = await new Promise((resolve) => { Papa.parse(files[0], { complete: function(results) { resolve(results); } }); }); // 解析完成后,收集所有axios请求的promise const promises = []; for (const element of parseResult.data) { // 跳过空行(避免无效请求) if (!element[0]) continue; const Data_1 = trimstr(element[0], ' ('); const Data_2 = element[1]; const Data_3 = element[2]; const Data_4 = element[3]; const Data_5 = element[4]; const Data_6 = element[6]; const Data_7 = element[7]; const requestPromise = axios.post(APIURL, { POST_1: ID, // 确保ID变量已定义且有有效值 POST_2: Data_1, POST_3: Data_2, POST_4: Data_3, POST_5: Data_4, POST_6: Data_5, POST_7: Data_6, POST_8: Data_7 }); promises.push(requestPromise); } // 等待所有请求完成后再刷新页面 await Promise.all(promises); window.location.reload(true); } beginpost();
额外优化建议
如果380条请求同时发起导致后端压力过大或浏览器请求被限制,可以考虑分批发送(比如每次发20条,完成一批再发下一批),示例代码:
// 分批处理,每20条为一批 const batchSize = 20; for (let i = 0; i < promises.length; i += batchSize) { const batch = promises.slice(i, i + batchSize); await Promise.all(batch); }
内容的提问来源于stack exchange,提问作者darkfury
相关产品推荐
相关产品推荐

