在sequlize结果集中迭代

时间:2016-03-24 08:10:12

标签: promise sequelize.js hapijs

我需要迭代sequelize结果的结果集。我有一个有效的代码,但我觉得它有问题,不应该这样做。 我觉得这是一个阻止代码。 这是有效的代码:

 models.Project.findAll({
            where: {ProjectId: projectId}
        })
        .then(function (projects) {
            //Iteration is here
            var projectList = [];
            projects.forEach(function (res) {
                projectList.push(res.dataValues.PartId);
            });
             //then bulk lookup for the result
            models.Customers.findAll({
                where: {'id': {in: [projectList]}}
            }).then(function (customers) {
                reply(customers).code(200);
            }, function (rejectedPromiseError) {
                reply(rejectedPromiseError).code(401);
            });

            //reply(sameparts).code(200);
        }, function (rejectedPromiseError) {
            reply(rejectedPromiseError).code(401);
        });

这个迭代部分完成了:

projects.forEach(function (res) {
                projectList.push(res.dataValues.PartId);
            });

然后这段代码作为另一个查询执行:

models.Customers.findAll({
                where: {'id': {in: [projectList]}}
            }).then(function (customers) {
                reply(customers).code(200);
            }, function (rejectedPromiseError) {
                reply(rejectedPromiseError).code(401);
            });

如何重新排列它以便使用Promises?

编辑(可能的解决方案): 玩了一下后,我相信我已经实施了承诺。

getAll: function (request, reply) {
    var projectId = request.params.projectid;

    var promises = [];
    var post;

    models.SamePart.findAll({
            where: {ProjectId: projectId}
        })
        .then(function (sameparts) {
            //Iteration is here                
            sameparts.forEach(function (res) {
                promises.push(
                    Promise.all([               
                        models.Parts.findAll({where: {id: res.dataValues.PartId}})
                    ]))
            });
            //Bulk lookup for the parts that were marked as identical

            return Promise.all(promises);
        }).then(function (completepartslist) {
        reply(completepartslist).code(200);
    });

这是正确的做法吗?似乎completepartslist包含许多不需要的对象,包括Promise的东西。如何压扁它,以避免复杂的循环?

2 个答案:

答案 0 :(得分:1)

如果您使用的是.then(),那么您很可能已经在使用承诺。

您的原始工作代码似乎没有阻止。

您的最终getAll()看起来应简化为:

getAll: function (request, reply) {
    models.SamePart.findAll({
        where: { ProjectId: request.params.projectid }
    }).then(function (sameparts) {
        return Promise.all(sameparts.map(function (res) {
            return models.Parts.findAll({ where: { id: res.dataValues.PartId } });
        }));
    }).then(function (completepartslist) {
        reply(completepartslist).code(200);
    });
}

但是,您需要重新添加错误处理。

答案 1 :(得分:1)

更简化

getAll: function (request, reply) {
    models.SamePart.findAll({
        where: { ProjectId: request.params.projectid }
    }).reduce(function (completepartslist, sameparts) {
        return models.Parts.findAll({ where: { id: sameparts.PartId } }).
          then(function(res){
            completepartslist.concat(res)
          });
        }), []);
    }).then(function (completepartslist) {
        reply(completepartslist).code(200);
    });
}