1
votes

Renvoyer des documents avec une requête asynchrone dans une boucle foreach

Je suis forEaching sur un objet pour trouver les numéros d'identification, pour ensuite rechercher et renvoyer les documents associés de mongodb.

Je suis capable de consolider les documents dans la fonction forEach, mais je ne peux pas les renvoyer et j'ai du mal à comprendre pourquoi. C'est ma fonction ....

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

Je ne suis pas sûr de ce que je fais de mal, si c'est parce que c'est asynchrone, ou un forEach (je l'ai essayé avec pour / of et n'a pas pu obtenir cela pour retourner en dehors de la fonction non plus). Quelle est la meilleure façon de retourner ces documents?


0 commentaires

4 Réponses :


1
votes

Essayez 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) 


1 commentaires

J'ai essayé ceci, j'ai peur que cela n'ait pas fonctionné, il renvoie juste le nombre (personne) d'objets vides.



1
votes

forEach n'est pas asynchrone que vous pouvez utiliser pour la boucle

  for (const person of persons ) {
    const outputs = await Output.find({ person: person['id']  })
    console.log(outputs) // this works
    return outputs
  }


1 commentaires

@bevc avez-vous essayé cette solution? Je suis juste curieux!



1
votes

Vous devez appeler log dans une fonction asynchrone si vous souhaitez enregistrer la sortie combinée.

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


0 commentaires

2
votes

Vous pouvez utiliser .map () pour créer un tableau d’ID, puis utiliser $ in pour les trouver tous dans une seule requête. Quelque chose comme:

let myFunction = await Output.find({ 
  person: {
    $in: projects.people.map(person => person._id) 
  }
});
console.log(myFunction)


0 commentaires