2014-07-16 11 views
13

Używam modułu ramowego Koa.js i Mongoose.js.forEach przy użyciu generatorów w pliku Node.js

Normalnie, aby uzyskać wynik z MongoDB kod I tak:

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

Ale muszę wykonać tę linię dla każdego elementu tablicy o nazwie „przedmioty”.

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

Ale ten kod nie działa, ponieważ wydajność jest w funkcji. Jeśli napiszę to:

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

Nie otrzymam również wyniku w zmiennej res. Próbowałem użyć modułu "generator-foreach", ale to nie działało w ten sposób.

Wiem, że to jest mój brak wiedzy na temat znajomości języków Node.js. Ale czy możecie mi pomóc znaleźć sposób, jak to zrobić?

+0

Co dokładnie wypróbowałeś z 'generator-foreach'? – loganfsmyth

+0

Właśnie zastąpiłem dlaEe z generatorem foreach. Reszta kodu jest taka sama. Czy możesz zmodyfikować mój fragment kodu i upewnić się, że działa? –

Odpowiedz

4

Dzięki chłopaki, zrobiłem to za pomocą modułu "CO". Dzięki.

var co = require('co'); 

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

EDYCJA: Przy najnowszej wersji CO, potrzebujesz co.wrap(), aby to działało.

+0

To nie działa, ponieważ 'item' ===' items', gdy jest zapakowany w co() –

+0

Więc jak to rozwiązałeś? –

+4

Jeśli użyjesz standardu dla pętli 'for (x = 0; x

18

Można yield tablice, więc po prostu map obietnic async w innej mapy

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

Jest to znacznie prostsze i powinno być zaakceptowaną odpowiedzią. –

7

Zaakceptowanych odpowiedź jest błędna, nie ma potrzeby korzystania z biblioteki, tablica jest już iterable.

To stara sprawa, ale ponieważ nie ma poprawną odpowiedź jeszcze i to pojawia się na pierwszej stronie w wyszukiwarce Google dla kluczowych terminów „iteratory i forEach” będę odpowiedzieć na pytanie:

Nie ma konieczne jest iterowanie po tablicy, ponieważ tablica jest już zgodna z interfejsem API.

wewnątrz generatora wystarczy użyć „Wydajność * tablicę” (należy zauważyć, *) za Wydajność * wyrażenie jest używane do przekazania do innego generatora lub iterowalny obiektu

przykład:

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 } 

Przykłady i głębokość wizyta: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield *