2017-06-08 6 views
0

findByIdの結果を既存の配列にプッシュしようとしています。私のコードは次のようになります:Mongoose - findByIdの結果を配列に入れません。

var targetArray = []; var groupId; //別の関数からIDを取得します。

Group.findById((groupId), (error, group) => { 
    targetArray.push(group.toObject()); 
    console.log(targetArray); 
} 
console.log(targetArray); 

第1のログはグループを含む配列を返し、第2のログは空の配列[]を返します。

".toObject()"を使用して試してみましたが、単純な文字列を配列に挿入しようとしました。私がその機能を去った後、すべてが消えました。

これはmongoose固有の質問または一般的なjavascriptであるかどうかわかりませんが、通常、配列に何かをプッシュすると、それ自体が消えません。

皆さん、私が間違っていることを指摘できますか?

+0

この操作は非同期なので、終了するまでに時間がかかり、 'console.log()'の配列が 'targetArray'の配列になるまでにまだ空です。 – Gerardo

答えて

0

これは実際にjavascriptが非同期コードを処理する方法です。

あなたはfindByIdに渡されているので、JavaScriptコールスタックでしばらく時間がかかるコールバック関数が発生しています。これは、findById関数がそれらの引数を渡すとすぐに、javascriptはconsole.logの底部を実行します。この場合、配列はまだ空です。

引数として渡した関数は、mongooseが何らかのエラーやデータでmongoドライバから受信し、確認応答を受け取るとすぐに実行されます。

真実これは期待されています。実際にmongooseから返されたデータで何かをしたいのであれば、実際にはコールバック関数で行うべきです。

+0

ありがとう、私のコードがうまくいかない理由を理解するのに役立ちました。回避策で修正 –

関連する問題