Добавить свойство для объекта списка в цикле и вернуть этот объект, но он не был применен - PullRequest
0 голосов
/ 15 мая 2018

Я использую sequlize в узле, и я должен реализовать это свойство добавления в списке объекта из запросов sequlize.

member.findAll({
    where:{
        isPartner:1
    }
}).then(partnerList => {
    for(let i = 0; i<partnerList.length; i++){
        const partner_no = partnerList[i].dataValues.no;
        partner.findAll({
            include: [{
                model: member,
                required: true,
            }],
            where:{
                partner_no : partner_no
            }
        }).then(myCustomers => {
            partnerList[i].dataValues.myCustomers = myCustomers.length;

        })
    }
    return partnerList;
}).then(partnerList => {
    res.render('partner/partners', {partnerList: partnerList})
})

Я ожидаю, что объект добавит свойство myCustomers, но все атрибуты в списке несодержать это свойство.

Почему это?Как это можно исправить?

1 Ответ

0 голосов
/ 15 мая 2018

partner.findAll является асинхронным. Когда ваш код проходит цикл и инициализирует обещания, запросы только что были отправлены; .then s разрешает только после завершившего их потока, поэтому partnerList не заполняется до вас return partnerList. Вместо этого используйте Promise.all над всеми findAll с:

member.findAll({
  where:{
    isPartner:1
  }
}).then(async (partnerList) => {
  await Promise.all(partnerList.map(({ dataValues: { no } }) => (
    partner.findAll({
      include: [{
        model: member,
        required: true,
      }],
      where:{
        partner_no : no
      }
    }).then(myCustomers => {
      partnerList[i].dataValues.myCustomers = myCustomers.length;
    }))));
  return partnerList;
}).then(partnerList => {
  res.render('partner/partners', {partnerList: partnerList})
})

Но с async / await будет легче читать без .then s:

const partnerList = await member.findAll({
  where:{
    isPartner:1
  }
});
await Promise.all(partnerList.map(async ({ dataValues: { no } }) => {
  const myCustomers = await partner.findAll({
    include: [{
      model: member,
      required: true,
    }],
    where:{
      partner_no : partner_no
    }
  });
  partner.dataValues.myCustomers = myCustomers.length;
}));
res.render('partner/partners', {partnerList: partnerList});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...