如何将循环遍历的数据存入数组?附createSlots函数代码咨询
针对createSlots函数的优化与问题修复建议
嘿,我看了你的createSlots函数片段,发现几个关键问题需要修复,同时帮你完善逻辑来实现“循环遍历数据存入数组”的需求:
1. Promise未正确收尾
你的Promise里完全没调用resolve()或reject(),这会导致调用这个函数的代码永远等不到结果,Promise会一直处于pending状态。必须在所有操作完成后resolve最终的数组,遇到错误时及时reject错误信息。
2. 循环变量的闭包陷阱
你用var i声明循环变量,在异步操作(比如保存Availability实例)中,所有回调会共享同一个i的引用,最后拿到的都是循环结束后的i值(也就是count)。建议改用let i或者forEach/for...of循环来避免这个问题。
3. 缺失错误处理逻辑
JSON.parse(slots)可能因为格式错误直接抛出异常,没有捕获机制;Availability实例的保存操作(看起来是Mongoose模型的异步方法)可能失败,没有错误捕获和传递。
4. 数组填充逻辑不完整
你的代码里array数组没有填充逻辑,需要把每个处理后的结果(比如保存成功的实例)push到数组中,再在所有操作完成后返回。
优化后的完整代码(async/await版本,可读性更高)
function createSlots(experiences, req) { // 注意:如果req不在当前作用域,需要作为参数传入 return new Promise(async function(resolve, reject) { try { // 先校验输入数据 const slotsStr = req.body.availableSlots; if (!slotsStr) { return reject(new Error('请求体中缺少availableSlots字段')); } const slots = JSON.parse(slotsStr); const savedSlotsArray = []; // 用for...of循环避免闭包问题,同时支持异步等待 for (const slot of slots) { const { date, time: timeAvailability } = slot; const availability = new Availability({ expId: experiences._id, availabilitydate: date, availabilityslots: JSON.stringify(timeAvailability) }); // 等待实例保存完成,将结果存入数组 const savedSlot = await availability.save(); savedSlotsArray.push(savedSlot); } // 所有操作完成后,返回最终数组 resolve(savedSlotsArray); } catch (err) { // 捕获所有错误并传递给调用方 reject(err); } }); }
另一种并行处理方案(Promise.all,效率更高)
如果你的场景允许并行处理所有保存操作,用Promise.all可以大幅提升效率:
function createSlots(experiences, req) { // 注意传入req参数 return new Promise(function(resolve, reject) { try { const slotsStr = req.body.availableSlots; if (!slotsStr) { return reject(new Error('请求体中缺少availableSlots字段')); } const slots = JSON.parse(slotsStr); // 将每个slot的处理转换为Promise const savePromises = slots.map(slot => { const { date, time: timeAvailability } = slot; const availability = new Availability({ expId: experiences._id, availabilitydate: date, availabilityslots: JSON.stringify(timeAvailability) }); return availability.save(); }); // 等待所有Promise完成,直接返回结果数组 Promise.all(savePromises) .then(savedSlots => resolve(savedSlots)) .catch(err => reject(err)); } catch (err) { reject(err); } }); }
额外提醒
- 确保
Availability模型已正确定义,且save()方法返回Promise(Mongoose默认支持); - 如果
req对象不在createSlots的作用域内,一定要把它作为参数传入,否则会出现req is not defined的错误!
内容的提问来源于stack exchange,提问作者dev dev
相关产品推荐
相关产品推荐

