等待sequelize的查询

时间:2017-10-10 18:52:51

标签: mysql node.js sequelize.js

我目前正在使用带有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查询中进行迭代。

如何让它按预期工作?

1 个答案:

答案 0 :(得分:3)

由于数据库查询是异步操作,因此循环完成时不会执行任何查询,因此为了防止此推送,所有对数组的findAll调用和Promise.all(arrayOfPromises)将在所有findAll承诺成功解析后解析这些承诺。

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
  });
});