Node.js中如何阻止Fetch Promise对象提前执行?
解决方案
问题出在调用fetchURL(obj)的瞬间就会立即执行fetch发起请求——fetch是立即执行的异步函数,调用它就会返回一个已经开始执行的Promise实例,所以你当前得到的数组里全是已在运行的Promise,自然会提前触发请求。
要实现「先存储待执行的Promise创建逻辑,之后再并行执行」,你需要存储能生成Promise的函数,而非直接存储Promise实例。修改代码如下:
第一步:修改createFetchObjectArray返回函数数组
async function createFetchObjectArray(records) { // 定义工厂函数,返回一个未执行的fetch调用函数 const createFetchTask = (obj) => () => fetch('http://localhost:8888/.netlify/functions/meta1', { method: 'POST', body: JSON.stringify(obj), headers: { 'Content-Type': 'application/json' } }); let outputArray = []; // 去掉不必要的await,改用while循环避免数组长度变化导致的循环次数错误 while (records.length > 0) { const record = records.pop(); const obj = { "_id": record._id }; // 存入未执行的函数,调用它才会触发fetch请求 const fetchTask = createFetchTask(obj); outputArray.push(fetchTask); } return outputArray; }
第二步:需要并行执行时再生成Promise并运行
for (let i = 0; i < groupedRecords.length; i++) { const groupedRecord = groupedRecords[i]; // 现在fetchObjects是函数数组,每个函数调用后才会返回Promise const fetchObjects = await createFetchObjectArray(groupedRecord); // 触发并行执行:调用所有函数生成Promise数组,再用Promise.allSettled处理 const promiseArray = fetchObjects.map(task => task()); const responses = await Promise.allSettled(promiseArray); // 在这里处理responses结果... }
额外修正说明
- 原代码中
await records.pop()完全多余,pop是同步方法,不需要添加await。 - 原循环用
for (let i = 0; i < records.length; i++)搭配records.pop()会导致循环次数异常,因为每次pop都会缩短数组长度,改用while循环更稳妥。
内容的提问来源于stack exchange,提问作者user1592380
相关产品推荐
相关产品推荐

