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