首页 > 解决方案 > 使用for each in node js sequelize将数据存储在数组中

问题描述

我正在尝试使用 foreach 将获取的数据推送到数组中,但它只返回循环中的第一个数据。这是我的代码。

exports.getAllTrial = async function (req, res, next) {

try {
    
    new Promise( async (resolve, reject) => {
        var reservations = [];
        await Schedule.getSchedule()
        .then(data => {
            data.forEach(async (element) => { 
                await saveReserve.getAllTrial({where: {scheduleID: element.id, date: "8/18/2020"}})
                .then(trial => {
                    trial.forEach(response => { 
                        reservations.push(response.scheduleID)
                    })
                }) 
                console.log(reservations);
                resolve(reservations);
            })
        });
    })

    .then(value=>{
        res.status(200).json(value);
    })
    .catch(err => {
        console.log(err);
    });

} catch (e) {
    return res.status(400).json({ status: 400, message: e.message });
}

}

我的预期输出应该是: [ 9, 10, 10 ] 但它只返回 [9]。

标签: node.jsarraysforeachsequelize.js

解决方案


foreach 循环中的异步代码是个坏主意,因为它不会一个接一个地执行。我建议阅读更多 async/await 和 promise 的概念,因为您在这里混合了一些东西(例如混合await.then)。还值得研究Promise.all哪个将解决承诺列表和array.map.

虽然我不知道某些变量saveReserve应该是什么或做什么,但您的代码可能会简化为:

exports.getAllTrial = async (req, res, next) => {
  try {
    const data = await Schedule.getSchedule()

    const reservations = await Promise.all(
      data.map(element => {
        return saveReserve.getAllTrial({ where: { scheduleID: element.id, date: '8/18/2020' } })
      })
    )

    return res.status(200).json(reservations)
  } catch (e) {
    return res.status(400).json({ status: 400, message: e.message })
  }
}

推荐阅读