Как запустить поиск мангуста внутри Foreach синхронно - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть запрос для коллекции "Case", и для каждой записи мне нужно сопоставить другую коллекцию "CustomerAgreement". Поэтому я использую forEach и вызываю второй запрос внутри него. Проблема в том, что запрос выполняется после завершения forEach.

Допустим, есть 5 случаев.

Case.find({},{case_id:1}).then(recs=>{
     recs.forEach(function(rec){
         console.log("x");
         CustomerAgreement.findOne({case_id:rec.case_id}).then(t=>{
             console.log("y");
         });
     });

     console.log("z");
});

Результат, который я получаю (при условии 5 случаев) Икс Икс Икс Икс Икс Z Y Y Y Y у

Результат, который я хочу получить Икс Y Икс Y Икс Y Икс Y Икс Y г

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

если вы можете использовать async / await, вы можете использовать for of loop

const recs = await Case.find({}, {case_id: 1});

for (const rec of recs) {
  console.log("x");

  const t = await CustomerAgreement.findOne({ case_id: rec.case_id }).exec();
  console.log("y");
}

console.log("z");

, если нет, вы можете использовать async , это библиотека, которая позволяет вам делатьоперации такого рода.

Case.find({}, { case_id: 1 }).then((recs) => {
  async.each(recs, (rec, callback) => {
    console.log("x");
    CustomerAgreement.findOne({ case_id : rec.case_id }).then((t) => {
      console.log("y");
      callback();
    });
  }, (err) => {
    if (err) {
      console.log(err);
    } else {
      console.log('all records found successfully');
      console.log("z");
    }
  });
});

PD: я не тестировал приведенный выше код, но теоретически должен работать.

0 голосов
/ 19 апреля 2019

Вы можете использовать асинхронную функцию и ждать каждый запрос в цикле:

Case
  .find({}, { case_id: 1 })
  .then(async (recs) => {

    for (const rec of recs) {
      console.log("x");

      const t = await CustomerAgreement
        .findOne({ case_id: rec.case_id })
        .exec();

      console.log("y");
    }

    console.log("z");
  });

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...