You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将循环遍历的数据存入数组?附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:17:25