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

我也没有得到res变量的结果。我试图使用“ generator-foreach ”模块,但这种方式不起作用。

我知道这是我对Node.js的语言素养缺乏了解。但是你们能帮我找到一种方法吗?

JinJin十三宝儿2020/03/30 17:19:15

公认的答案是错误的,不需要使用库,数组已经是可迭代的。

这是一个古老的问题,但是由于它尚无正确答案,并且出现在Google搜索的第一页上,关键词为“ iterators and forEach”,因此我将回答这个问题:

由于数组已经符合可迭代的API,因此无需遍历数组。

在生成器内部,只需使用“ yield *数组”(请注意*),yield *表达式用于委派给另一个生成器或可迭代对象

例:

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 *

猪猪2020/03/30 17:19:15

您可以yield数组,所以只需将异步承诺映射到另一个映射中

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