आपके प्रयास में forEach लूप findById()
के कॉलबैक पूर्ण होने की पहचान नहीं करता है अगले पुनरावृत्ति से पहले async विधि। आपको किसी भी async
का उपयोग करने की आवश्यकता है
पुस्तकालय के तरीके async.each
, async.whilst
, या async.until
जो एक लूप के बराबर हैं, और अगले पुनरावृत्ति पर जाने से पहले एसिंक्स के कॉलबैक को लागू करने तक प्रतीक्षा करेंगे (दूसरे शब्दों में, एक लूप के लिए जो उपज देगा)।
उदाहरण के लिए:
var platform_docs = [];
async.each(platforms, function(id, callback) {
Platform.findById(id, function(err, platform) {
if (platform)
platform_docs.push(platform);
callback(err);
});
}, function(err) {
// code to run on completion or err
console.log(platform_docs);
});
पूरे ऑपरेशन के लिए, आप async.waterfall()
विधि जो प्रत्येक फ़ंक्शन को अपने परिणामों को अगले फ़ंक्शन पर पास करने की अनुमति देती है।
विधि में पहला कार्य नया लेख बनाता है।
दूसरा फ़ंक्शन async.each()
. का उपयोग करता है प्लेटफ़ॉर्म सूची पर पुनरावृति करने के लिए उपयोगिता फ़ंक्शन, findByIdAndUpdate()
, और जब वे सभी काम पूरा कर लें तो किसी ऑब्जेक्ट वेरिएबल में अद्यतन क्वेरी के परिणाम अगले फ़ंक्शन पर वापस कर दें।
अंतिम कार्य पिछले पाइपलाइन से प्लेटफ़ॉर्म आईडी के साथ नव निर्मित लेख को अपडेट करेगा।
निम्न उदाहरण जैसा कुछ:
var newArticle = {},
platforms = req.body.platforms,
date = req.body.date,
split = date.split("/");
newArticle.title = req.body.title;
newArticle.description = req.body.description;
newArticle.date = split[2]+'/'+split[0]+'/'+split[2];
newArticle.link = req.body.link;
newArticle.body = req.body.body;
console.log(platforms);
async.waterfall([
// Create the article
function(callback) {
var article = new Article(newArticle);
article.save(function(err, article){
if (err) return callback(err);
callback(null, article);
});
},
// Query and update the platforms
function(articleData, callback) {
var platform_ids = [];
async.each(platforms, function(id, callback) {
Platform.findByIdAndUpdate(id,
{ "$push": { "articles": articleData._id } },
{ "new": true },
function(err, platform) {
if (platform)
platform_ids.push(platform._id);
callback(err);
}
);
}, function(err) {
// code to run on completion or err
if (err) return callback(err);
console.log(platform_ids);
callback(null, {
"article": articleData,
"platform_ids": platform_ids
});
});
},
// Update the article
function(obj, callback) {
var article = obj.article;
obj.platform_ids.forEach(function(id){ article.platforms.push(id); });
article.save(function(err, article){
if (err) return callback(err);
callback(null, article);
});
}
], function(err, result) {
/*
This function gets called after the above tasks
have called their "task callbacks"
*/
if (err) return next(err);
console.log(result);
res.redirect('articles/' + result._id);
});