Возврат документов с асинхронным запросом c в цикле foreach - PullRequest
1 голос
/ 25 марта 2020

Я forEaching по объекту, чтобы найти номера идентификаторов, а затем искать и возвращать соответствующие документы из mongodb.

Я могу утешить документы в функции forEach, но не могу их вернуть, и я пытаюсь понять, почему. Это моя функция ....

let myFunction = projects.people.forEach(async function (person) {
    const outputs = await Output.find({ person: person._id })
    console.log(outputs) // this works
    return outputs
})
console.log(myFunction) // this does not work

Я не уверен, что я делаю неправильно, если это потому, что это asyn c или forEach (я пробовал с for / of и не мог заставить это вернуться за пределы функции). Какой лучший способ вернуть эти документы?

Ответы [ 4 ]

2 голосов
/ 25 марта 2020

Вы можете использовать .map() для создания массива идентификаторов, а затем использовать $ в операторе , чтобы найти их все в одном запросе. Что-то вроде:

let myFunction = await Output.find({ 
  person: {
    $in: projects.people.map(person => person._id) 
  }
});
console.log(myFunction)
1 голос
/ 25 марта 2020

forEach is asyn c вы можете использовать для l oop

  for (const person of persons ) {
    const outputs = await Output.find({ person: person['id']  })
    console.log(outputs) // this works
    return outputs
  }
1 голос
/ 25 марта 2020

Вам нужно вызвать log в функции asyn c, если вы хотите зарегистрировать комбинированный вывод.

const Output =  {
   find(obj) {
    return obj;
  }
}

const projects = {
  people: [{
    _id: 1
  }, {
    _id: 2
  }]
}

const myFunction = async() => Promise.all(projects.people.map(person => Output.find({
  person: person._id
})));

async function log() {
  console.log(await myFunction());
}

log();
1 голос
/ 25 марта 2020

Попробуйте map

let myFunction = projects.people.map(async function (person) {
    const outputs = await Output.find({ person: person._id })
    console.log(outputs) // this works
    return outputs
})
console.log(myFunction) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...