Sequelize查询中正确的Promise链接

时间:2018-07-22 12:47:49

标签: javascript node.js express promise sequelize.js

我正在使用node / Express,Sequelize和MySQL,并试图实现一些承诺。

我有Project模型,并且有hasMany关系,我有ProjectImages。我正在添加/更新特定项目(chainedPromises)的图像中的某些行,完成此任务后,我想返回该项目及其所有图像:

var chainedPromises = [];
// First resolve this group
data.ProjectImages.forEach((element) => {
    chainedPromises.push(
        models.ProjectImages.upsert(element, {
            where: {
                id: element.id,
            },
        })
    );
});
Promise.all(chainedPromises)
    .then((responses) => {
        responses.map((response) => {
            logJSON(response);
        });
    })
    // Then look for the project and related models
    .then(() => {
        models.Projects.findById(req.params.id, {
            include: [
                {
                    model: models.ProjectImages,
                },
            ],
        })
        // And return it
        .then((result) => {
            logJSON(result);
            return res.send({
                Project: result,
            });
        });
    });

它可以工作,但是我认为它有点像回调地狱。

那么,有没有更好的方法来实现这一诺言呢?

此外,这种在关联模型中添加/更新行的方式会创建大量查询。有更好的方法来执行此任务吗?

1 个答案:

答案 0 :(得分:1)

好吧,您实际上并没有兑现承诺,而是将它们嵌套了。

正确的链接如下所示:

Promise.all(chainedPromises)
    .then((responses) => {
        responses.map((response) => {
            logJSON(response);
        });
    })
    // Then look for the project and related models
    .then(() => models.Projects.findById(req.params.id, {
        include: [
            {
                model: models.ProjectImages,
            },
        ],
    }))
    // And return it
    .then((result) => {
        logJSON(result);
        return res.send({
            Project: result,
        });
    });

您也可以查看async / await