【问题标题】:Wait for queries with sequelize使用 sequelize 等待查询
【发布时间】:2018-03-22 06:51:42
【问题描述】:

我目前正在使用带有 Sequelize (MySQL) 的 Node.js,并且有两个模型之间存在关联:M.belongsTo(C)。我要做的是查询所有 C 并将所有属于 C 的 M 添加到返回的 JSON 对象中。请参阅下面代表我最近尝试的代码:

C.findAll({
    where: {
        parent_ids: ids
    }
}).then(cs => {
    let fCs = [];
    for (let j = 0; j < cs.length; j++) {
        let c = cs[j].get({ plain: true });

        M.findAll({
            where: {
                CId: c._id
            }
        }).then(ms => {
            let cMs = [];
            for (let k = 0; k < ms.length; k++) {
                cMs.push(ms[k].get({ plain: true }));
            }

            c.ms = cMs;
        });

        fCs.push(c);
    }

    return res.json({
        success: true,
        cs: fCs
    });
}).catch(error => {
    return res.json({
        success: false
    });
});

问题是M 模型上的内部查询是作为异步查询进行的,我在执行任何查询之前得到响应。我也尝试使用Promise.all(),但我无法使其正常工作,因为我在外部C 查询中进行迭代。

我怎样才能让它按预期工作?

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    由于 db 查询是异步操作,因此循环完成时不会执行任何查询,因此为了防止这种情况将所有 findAll 调用推送到数组,并且一旦所有 findAll 承诺成功解决,Promise.all(arrayOfPromises) 就会解决这些承诺。

    var fCs = [], cs,
    C.findAll({
      where: {
        parent_ids: ids
      }
    }).then(data => {
      cs = data;
      var promises = [];
      for (let j = 0; j < cs.length; j++) {
        let c = cs[j].get({ plain: true });
    
        promises.push(M.findAll({
            where: {
                CId: c._id
            }
        }).then(ms => {
            let cMs = [];
            for (let k = 0; k < ms.length; k++) {
                cMs.push(ms[k].get({ plain: true }));
            }
    
            return cMs;
        }));
      }
      return Promise.all(promises)
    }).then(result => {
      fcs = cs.map((el, index) => {
        let obj = el.get({plain:  true})
        obj.ms = result[index]
        return obj
      })
      return res.json({
        success: true,
        cs: fCs
      });
    }).catch(error => {
      return res.json({
        success: false
      });
    });
    

    【讨论】:

    • 谢谢!我的错误是我试图以错误的方式使用Promise.all()
    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 2019-06-16
    • 2018-11-06
    • 2020-03-02
    • 2016-06-10
    • 1970-01-01
    • 2017-10-30
    • 2023-02-04
    相关资源
    最近更新 更多