Итерация внутри результирующего набора последовательностей

Мне нужно перебрать набор результатов из результата продолжения. У меня есть код, который работает, но я думаю, что с ним что-то не так, и так делать нельзя. У меня такое ощущение, что это блокирующий код. Это код, который работает:

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

Как я могу изменить его так, чтобы он использовал обещания?

РЕДАКТИРОВАТЬ (Возможное решение): немного поиграв, я считаю, что выполнил обещания.

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. Как я могу сгладить его, чтобы избежать сложных циклов for?


person Wexoni    schedule 24.03.2016    source источник


Ответы (2)


Если вы используете .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);
    });
}

Однако вам нужно добавить обработку ошибок обратно.

person Roamer-1888    schedule 24.03.2016
comment
Спасибо за рефакторинг и подтверждение :) - person Wexoni; 24.03.2016

еще более упрощенный

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);
    });
}
person Alessandro Loziobiz Bisi    schedule 24.03.2016