2014-07-16 11 views
13

Ich verwende Koa.js Framework und Mongoose.js Modul.forEach Verwendung von Generatoren in Node.js

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

Aber ich brauche auszuführen diese Zeile für jedes Element eines Arrays namens ‚Artikel‘:

Normalerweise ein Ergebnis von MongoDB ich Code wie diesen zu bekommen.

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

Aber dieser Code läuft nicht, da die Ausbeute in der Funktion ist. Wenn ich dies schreibe:

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

Ich bekomme nicht das Ergebnis in res Variable entweder. Ich habe versucht, 'generator-foreach' Modul zu verwenden, aber das hat nicht so funktioniert.

Ich weiß, dass dies mein Mangel an Wissen über die Sprachkompetenz von Node.js ist. Aber könnt ihr mir helfen, einen Weg zu finden, wie das geht?

+0

Was genau haben Sie mit 'generator-foreach' probiert? – loganfsmyth

+0

Ich ersetzte nur forEach mit dem Generator-foreach. Der Rest des Codes ist gleich. Können Sie mein Code-Snippet ändern und sicherstellen, dass es funktioniert? –

Antwort

4

Danke Jungs, ich habe dies mit dem 'CO' Modul getan. Vielen Dank.

EDIT: Mit der neuesten Version von CO benötigen Sie co.wrap(), damit dies funktioniert.

+0

Dies funktioniert nicht, weil 'item' ===' items' wenn es mit co umhüllt ist() –

+0

Also, wie hast du es gelöst? –

+4

Wenn Sie einen Standard für die Schleife 'for (x = 0; x

18

Sie können yield Arrays, so Karte nur Ihre async Versprechen in einer anderen Karte

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

Dies ist viel einfacher und sollte die akzeptierte Antwort sein. –

7

Die akzeptierte Antwort falsch ist, gibt es keine Notwendigkeit, eine Bibliothek zu verwenden, ein Array ist bereits ein iterable.

Dies ist eine alte Frage, aber da es noch keine richtige Antwort hat und es erscheint auf der ersten Seite der Google-Suche für die wichtigsten Begriffe „Iteratoren und forEach“ Ich werde die Frage antworten:

Es gibt keine müssen über ein Array iterieren, da ein Array bereits der iterierbaren API entspricht.

in Ihrem Generator verwenden nur "yield * array" (man beachte die *) Ausbeute * Ausdruck verwendet wird, um einen weiteren Generator oder iterable Objekt

Beispiel zu delegieren:

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 } 

Beispiele und in Tiefeninformationen: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield *

Verwandte Themen