JavaScriptの約束を理解するのに苦労しています。私は特定の条件を満たすオブジェクトのMongooseモデルを検索しています。存在する場合は、そのオブジェクトをプレーンなJSオブジェクトにしてプロパティを追加したいと考えています。forEachループ内での非同期findOne()操作
残念ながら、私の約束が解決し終わる前に私のforEach
ループが完全に実行されることを確実にするために頭を抱えることができません。私のコードを見てください。
// Called to check whether a user has participated in a given list of challenges
participationSchema.statics.getParticipation = function(user, challenges) {
return new Promise((resolve, reject) => {
challengesArray = [];
challenges.forEach((challenge) => {
// Model#findOne() is Async--how to ensure all these complete before promise is resolved?
Participation.findOne({user, challenge})
.then((res) => {
if (res) {
var leanObj = challenge.toObject();
leanObj.participation = true;
challengesArray.push(leanObj);
}
})
.catch(e => reject(e));
})
console.log("CHALLENGES ARRAY", challengesArray); // Challenges Array empty :(
resolve(challengesArray);
});
}
私は同様の質問を見てきましたが、答えに達することができませんでした。ヘルプをよろしくお願いいたします。
[ 'Promise'コンストラクタアンチパターン](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-を避けてくださいそれ)、 'forEach'を使わないでください!あなたは 'Promise.all'を探しています – Bergi
非同期コードが非同期であるため、非同期結果が利用可能になる前に' challengArray'を明確に解決しています。 –