19

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 の言語リテラシーに関する私の知識不足であることは承知しています。しかし、これを行う方法を見つけるのを手伝ってもらえますか?

4

3 に答える 3

11

受け入れられた答えは間違っています。ライブラリを使用する必要はありません。配列はすでに反復可能です。

これは古い質問ですが、まだ正解がなく、「イテレータと forEach」というキーワードで Google 検索の最初のページに表示されるため、次の質問に回答します。

配列はすでに反復可能な 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 *をご覧ください。

于 2016-07-18T21:24:31.047 に答える
7

みんなありがとう、私は ' CO ' モジュールを使用してこれを行いました。ありがとう。

var co = require('co');

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

編集: CO の最新バージョンでは、これを機能させるには co.wrap() が必要です。

于 2014-07-17T05:00:45.710 に答える