私は本当にあなたが間違ったやり方をしていると思うのですが、彼らはあなたが思っているものにはるかに単純で論理的なアプローチをしているようです。
"データベースに無作為に選んだ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()
に入力してください。約束事を解決するためのユースケースはありますが、これは実際には最適な解決策ではありません。
ここで約束があなたに役立つと思われるのはなぜですか?プロミスは、XHRequestsのような非同期アクションでの連鎖機能に使用される非常に一般的なものです。問題はどこですか?あなたのデータベースに書き込めませんか? 'const PlayerGenerator'も完全に同期しているように見えますが、ここで約束している点はありません。また、このデータをデータベースに書き込もうとしているのであれば、なぜ 'const'を使用していますか? また、約束事はES6 +ノードではかなり完全に実装されているので、Bluebirdのようなライブラリを使って過度に複雑にするのはなぜですか? – ajxs
もう少し簡潔にする* "ここに非同期コードはありません" *。 "多分"あなたの 'Player'オブジェクトはデータベース内での実際の作成を必要とし、それらが実際に作成された後にしか戻ってこないことを望みます。それはあなたがここで求めていることですか? 'new Player()'は非同期メソッドではないためです。もちろん、私たちが知らないものを隠していない限り。私の "推測"は、これは単なるモングースモデルの参考にすぎないということです。だから非同期。まだ! –