यह एक अतुल्यकालिक मुद्दा है। आप कॉलबैक के अंदर सरणी के मान को पॉप्युलेट कर रहे हैं। लेकिन इवेंट लूप की प्रकृति के कारण, यह असंभव है कि 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
. के लिए ... इस तरह आपको सभी वादों की एक सरणी मिल रही है (मैं आपका findOne
मान रहा हूं .then
. की वजह से एक वादा वापस कर रहा है )।
फिर आप एक Promise.all
. का उपयोग करते हैं सभी वादों को हल करने के लिए प्रतीक्षा करने के लिए, और फिर आपके पास अपनी सरणी होनी चाहिए।
साइड नोट:एक अधिक सुरुचिपूर्ण समाधान में newId
returning को वापस करना शामिल होगा अपने .then
. के अंदर . उस स्थिति में Promise.all
वास्तव में सभी वादों के परिणामों की एक सरणी के साथ हल करेगा, जो कि newId
के मान होंगे ।