जैसा कि किसी अन्य उत्तर में बताया गया है, यह कोड असीमित है, आप कॉलबैक (नेस्टेड फ़ंक्शंस) की श्रृंखला के नीचे इच्छित मान को वापस नहीं कर सकते हैं। आपको कुछ इंटरफ़ेस को उजागर करने की आवश्यकता है जो आपको वांछित मूल्य प्राप्त करने के बाद आपको कॉलिंग कोड को सिग्नल करने देता है (इसलिए, उन्हें वापस कॉल करना, या कॉलबैक)।
एक अन्य उत्तर में एक कॉलबैक उदाहरण दिया गया है, लेकिन एक वैकल्पिक विकल्प निश्चित रूप से तलाशने लायक है:वादे।
कॉलबैक फ़ंक्शन के बजाय आप वांछित परिणामों के साथ कॉल करते हैं, मॉड्यूल एक वादा देता है जो दो राज्यों में प्रवेश कर सकता है, पूरा या अस्वीकार कर सकता है। कॉलिंग कोड इन दो राज्यों में से किसी एक में प्रवेश करने के वादे की प्रतीक्षा करता है, जब यह उचित कार्य करता है तो उसे कॉल किया जाता है। मॉड्यूल resolve
. द्वारा राज्य परिवर्तन को ट्रिगर करता है आईएनजी या reject
आईएनजी। वैसे भी, यहाँ वादों का उपयोग करते हुए एक उदाहरण दिया गया है:
Db1.js:
// db1.js
var MongoClient = require('mongodb').MongoClient;
/*
node.js has native support for promises in recent versions.
If you are using an older version there are several libraries available:
bluebird, rsvp, Q. I'll use rsvp here as I'm familiar with it.
*/
var Promise = require('rsvp').Promise;
module.exports = {
FindinCol1: function() {
return new Promise(function(resolve, reject) {
MongoClient.connect('mongodb://localhost:27017/db1', function(err, db) {
if (err) {
reject(err);
} else {
resolve(db);
}
}
}).then(function(db) {
return new Promise(function(resolve, reject) {
var collection = db.collection('col1');
collection.find().toArray(function(err, items) {
if (err) {
reject(err);
} else {
console.log(items);
resolve(items);
}
});
});
});
}
};
// app.js
var db = require('./db1');
db.FindinCol1().then(function(items) {
console.info('The promise was fulfilled with items!', items);
}, function(err) {
console.error('The promise was rejected', err, err.stack);
});
अब, node.js mongodb ड्राइवर के अधिक अद्यतित संस्करणों के पास वादों के लिए मूल समर्थन है, आपको ऊपर दिए गए वादों में कॉलबैक को लपेटने के लिए कोई काम करने की आवश्यकता नहीं है। यदि आप अप टू डेट ड्राइवर का उपयोग कर रहे हैं तो यह एक बेहतर उदाहरण है:
// db1.js
var MongoClient = require('mongodb').MongoClient;
module.exports = {
FindinCol1: function() {
return MongoClient.connect('mongodb://localhost:27017/db1').then(function(db) {
var collection = db.collection('col1');
return collection.find().toArray();
}).then(function(items) {
console.log(items);
return items;
});
}
};
// app.js
var db = require('./db1');
db.FindinCol1().then(function(items) {
console.info('The promise was fulfilled with items!', items);
}, function(err) {
console.error('The promise was rejected', err, err.stack);
});
वादे एसिंक्रोनस नियंत्रण प्रवाह के लिए एक उत्कृष्ट विधि प्रदान करते हैं, मैं अत्यधिक अनुशंसा करता हूं कि कुछ समय खुद को उनके साथ परिचित करने में व्यतीत करें।