web-dev-qa-db-fra.com

forEach utilisant des générateurs dans Node.js

J'utilise Koa.js framework et Mongoose.js module.

Normalement, pour obtenir un résultat de MongoDB, je code comme ceci:

var res = yield db.collection.findOne({id: 'my-id-here'}).exec();

Mais je dois exécuter cette ligne pour chaque élément d'un tableau nommé 'items'.

items.forEach(function(item) {
  var res = yield db.collection.findOne({id: item.id}).exec();
  console.log(res)  // undefined
});

Mais ce code ne s'exécute pas car yield est dans la fonction. Si j'écris ceci:

items.forEach(function *(item) {
  var res = yield db.collection.findOne({id: item.id}).exec();
  console.log(res)  // undefined
});

Je n'obtiens pas non plus le résultat dans la variable res. J'ai essayé d'utiliser le module ' generator-foreach ' mais cela n'a pas fonctionné comme ça.

Je sais que c'est mon manque de connaissances sur l'alphabétisation linguistique de Node.js. Mais pouvez-vous m'aider à trouver un moyen de procéder?

15
Mazhar Ahmed

Merci les gars, je l'ai fait en utilisant le module ' CO '. Merci.

var co = require('co');

items.forEach(co(function* (item) {
  var img = yield db.collection.findOne({id: item.id}).exec();
}));

EDIT: Avec la dernière version de CO, vous avez besoin de co.wrap () pour que cela fonctionne.

6
Mazhar Ahmed

Vous pouvez yield tableaux, mappez simplement vos promesses asynchrones dans une autre carte

var fetchedItems = yield items.map((item) => {
   return db.collection.findOne({id: item.id});
});
21
Umidbek Karimov

La réponse acceptée est fausse, il n'est pas nécessaire d'utiliser une bibliothèque, un tableau est déjà un itérable.

C'est une vieille question, mais comme elle n'a pas encore de réponse correcte et qu'elle apparaît sur la première page de la recherche Google pour les termes clés "itérateurs et pour chacun", je répondrai à la question:

Il n'est pas nécessaire d'itérer sur un tableau, car un tableau est déjà conforme à l'API itérable.

à l'intérieur de votre générateur, utilisez simplement "yield * array" (notez le *) yield * expression est utilisée pour déléguer à un autre générateur ou objet itérable

Exemple:

let arr = [2, 3, 4];

    function* g2() { 
      yield 1;
      yield* arr;
      yield 5;
    }

    var iterator = g2();

    console.log(iterator.next()); // { value: 1, done: false }
    console.log(iterator.next()); // { value: 2, done: false }
    console.log(iterator.next()); // { value: 3, done: false }
    console.log(iterator.next()); // { value: 4, done: false }
    console.log(iterator.next()); // { value: 5, done: false }
    console.log(iterator.next()); // { value: undefined, done: true }

Pour des exemples et des informations détaillées, visitez: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield *

8
Jorge Riv