これは非同期の問題です。コールバック内に配列の値を入力しています。ただし、イベントループの性質上、console.log
までにコールバックが呼び出されることはありません。 実行されます。
あなたは約束を含む解決策について言及しました、そしてそれはおそらく正しい策略です。たとえば、次のようなものです。
exports = function(orgLoc_id, data) {
// ...
let stream_ids = [];
const promises = data.map(function(stream) {
return streamsCollection.findOne({ _id: stream.stream_id }, { type: 1, sizes: 1 })
.then(res => { //if I comment this query it will push without any problem
if (res) {
let newId = new BSON.ObjectId();
// ...
stream_ids.push(newId);
}
})
})
Promise.all(promises).then(function() {
console.log('stream ids: ' + stream_ids);
//TODO
// any code that needs access to stream_ids should be in here...
});
};
forEach
の変更に注意してください map
へ ...そうすれば、すべてのPromiseの配列を取得できます(findOne
を想定しています) .then
のためにpromiseを返しています 。
次に、Promise.all
を使用します すべての約束が解決するのを待ってから、アレイを用意する必要があります。
補足:より洗練されたソリューションには、newId
を返すことが含まれます。 .then
の内部 。その場合、Promise.all
実際には、すべてのpromiseの結果の配列で解決されます。これは、newId
の値になります。 。