2016-03-27 30 views
0

簡単なことを解決するにはいくつかの困難があります。 私はNodeJSとmongodbを使用しており、約束を使用するためにBluebirdもインストールしています。NodeJS - Bluebird:ループが完了するのを待ちます

私はランダムな名前の束を作成する場所をforループの簡単なを持って、そして配列にそれらを押して、次のように:

const PlayerGenerator =() => { 
    var playerArray = [] 
    for (var i = 0; i < 15; i++) { 
     const player = new Player({ 
     name: 'Player' + Math.random() * 100 
     }) 
     playerArray.push(player) 
    } 

    return playerArray 

} 

私は私のデータベースにすべてのこれらの名前を書きたい、ではなく、すべてのプレイヤーが自分のデータベースに書き込まれるように、私の約束を正しく設定する方法を静かに確認してください。私はここに別のスレッドで読んだものから、

server.get('api/team/new', (req, res, next) => { 
    const player = PlayerGenerator() 
    // This array contains 15 players with the exact same name. 
}) 

は、約束はこの問題を解決するための最良の方法のようですが、私は上記のように、それを設定する方法がわから静かではないとアドバイスのビットを探しています。

+1

ここで約束があなたに役立つと思われるのはなぜですか?プロミスは、XHRequestsのような非同期アクションでの連鎖機能に使用される非常に一般的なものです。問題はどこですか?あなたのデータベースに書き込めませんか? 'const PlayerGenerator'も完全に同期しているように見えますが、ここで約束している点はありません。また、このデータをデータベースに書き込もうとしているのであれば、なぜ 'const'を使用していますか? また、約束事はES6 +ノードではかなり完全に実装されているので、Bluebirdのようなライブラリを使って過度に複雑にするのはなぜですか? – ajxs

+1

もう少し簡潔にする* "ここに非同期コードはありません" *。 "多分"あなたの 'Player'オブジェクトはデータベース内での実際の作成を必要とし、それらが実際に作成された後にしか戻ってこないことを望みます。それはあなたがここで求めていることですか? 'new Player()'は非同期メソッドではないためです。もちろん、私たちが知らないものを隠していない限り。私の "推測"は、これは単なるモングースモデルの参考にすぎないということです。だから非同期。まだ! –

答えて

1

私は本当にあなたが間違ったやり方をしていると思うのですが、彼らはあなたが思っているものにはるかに単純で論理的なアプローチをしているようです。

"データベースに無作為に選んだ15人のプレイヤーを作成して"を作成し、現在の方法が「一意に」ランダムではないため、一意のランダム名を取得するより良い方法は避けてください。

ちょうどあなたのような出力に何かを与えるために起こっている
Player.create(
    Array.apply(null,Array(15)).map(() => { 
    return { "name": "Player" + Math.floor(Math.random() * 100) } 
    }) 
).then((players) => { 
    console.log(players) 
}); 

[ { _id: 56f7488242727e6c308f79eb, name: 'Player87', __v: 0 }, 
    { _id: 56f7488242727e6c308f79ec, name: 'Player29', __v: 0 }, 
    { _id: 56f7488242727e6c308f79ed, name: 'Player81', __v: 0 }, 
    { _id: 56f7488242727e6c308f79ee, name: 'Player52', __v: 0 }, 
    { _id: 56f7488242727e6c308f79ef, name: 'Player12', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f0, name: 'Player93', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f1, name: 'Player69', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f2, name: 'Player88', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f3, name: 'Player81', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f4, name: 'Player48', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f5, name: 'Player38', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f6, name: 'Player82', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f7, name: 'Player47', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f8, name: 'Player85', __v: 0 }, 
    { _id: 56f7488242727e6c308f79f9, name: 'Player26', __v: 0 } ] 
を行う必要があり、この上のあなたの歴史はあなたがとにかくマングースを使用していると言うことから、 Player.create()に直接平野オブジェクトの配列を渡すことです

MongoDBでは、複数のドキュメントを1つのステートメントに挿入することができるため、実際にはデータベースへの呼び出しは実際には1つだけなので、これは最も理にかなっているようです。

もちろん、約束の解像度でプレイしたいのであれば、を使用してください。特に、すでにES6構成で動作している場合は、ここにBluebirdを含める必要はありません。

だけ.create()からPromiseを返すし、後で解決:

var playerPromises = Array.apply(null,Array(15)).map(() => { 
    return Player.create({ "name": "Player" + Math.floor(Math.random() * 100) }); 
    }); 

    Promise.all(playerPromises).then((players) => { 
     console.log(players); 
    }); 

だから、その場合にはあなただけ.create()によって返さPromiseを使用して、得られた配列にそれぞれを解決します。しかし実際には"15回"というデータベースに実際に書き込んでいますが、代わりに"1"リクエストを送ることができました。

私の2セントについては、直接作成したいものの配列を.create()に入力してください。約束事を解決するためのユースケースはありますが、これは実際には最適な解決策ではありません。

+0

優秀な回答、ありがとうございます! –

関連する問題