forEach在Node.js中使用生成器

我正在使用Koa.js框架和Mongoose.js模块。

通常从MongoDB得到一个结果我的代码是这样的:

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

但是我需要为名为'items'的数组的每个元素执行这一行。

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

但是这个代码不能像yield中的函数那样运行。 如果我写这个:

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

我也没有得到resvariables的结果。 我试图使用“ generator-foreach ”模块,但没有像这样工作。

我知道这是我对Node.js的语言素养缺乏了解。 但是,你们能帮我find办法吗?

你可以yield数组,所以只需将你的asynchronous承诺映射到另一个地图

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

被接受的答案是错误的,没有必要使用一个库,一个数组已经是一个可迭代的。

这是一个古老的问题,但由于它还没有正确的答案,它出现在谷歌search关键词“迭代器和forEach”的第一页,我会回答这个问题:

不需要遍历数组,因为数组已经符合可迭代的API。

在你的生成器里面,只需使用“yield * array”(注意*)yield *expression式就可以委托给另一个生成器或可迭代对象

例:

 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 } 

有关示例和深入信息,请访问: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield *

谢谢你们,我使用' CO '模块做了这个。 谢谢。

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

编辑:与最新版本的CO,你需要co.wrap()这个工作。