दूसरों के जवाब देने के बाद, आपने कहा कि आपकी समस्या स्थानीय चर थी। ऐसा करने का एक आसान तरीका ऐसा लगता है कि उन स्थानीय चर को समाहित करने के लिए एक बाहरी फ़ंक्शन लिखना है, फिर नामित आंतरिक फ़ंक्शन का एक गुच्छा उपयोग करें और उन्हें नाम से एक्सेस करें। इस तरह, आप कभी भी दो गहरे घोंसले बना सकते हैं, भले ही आपको एक साथ श्रृंखला के लिए कितने कार्यों की आवश्यकता हो।
यहाँ mysql
घोंसले के शिकार के साथ Node.js मॉड्यूल का उपयोग करने की मेरी नौसिखिया कोशिश है :
function with_connection(sql, bindings, cb) {
pool.getConnection(function(err, conn) {
if (err) {
console.log("Error in with_connection (getConnection): " + JSON.stringify(err));
cb(true);
return;
}
conn.query(sql, bindings, function(err, results) {
if (err) {
console.log("Error in with_connection (query): " + JSON.stringify(err));
cb(true);
return;
}
console.log("with_connection results: " + JSON.stringify(results));
cb(false, results);
});
});
}
निम्नलिखित आंतरिक कार्यों का उपयोग करते हुए एक पुनर्लेखन है। बाहरी फ़ंक्शन with_connection
स्थानीय चर के लिए धारक के रूप में भी उपयोग किया जा सकता है। (यहाँ, मैं मानकों मिल गया है sql
, bindings
, cb
एक समान तरीके से कि अधिनियम, लेकिन आप केवल में कुछ अतिरिक्त स्थानीय चर परिभाषित कर सकते हैं with_connection
।)
function with_connection(sql, bindings, cb) {
function getConnectionCb(err, conn) {
if (err) {
console.log("Error in with_connection/getConnectionCb: " + JSON.stringify(err));
cb(true);
return;
}
conn.query(sql, bindings, queryCb);
}
function queryCb(err, results) {
if (err) {
console.log("Error in with_connection/queryCb: " + JSON.stringify(err));
cb(true);
return;
}
cb(false, results);
}
pool.getConnection(getConnectionCb);
}
मैं सोच रहा था कि शायद उदाहरण चर के साथ एक वस्तु बनाना संभव होगा, और स्थानीय चर के प्रतिस्थापन के रूप में इन उदाहरण चर का उपयोग करना संभव है। लेकिन अब मुझे पता चला है कि नेस्टेड फ़ंक्शंस और स्थानीय चर का उपयोग करने वाला उपरोक्त दृष्टिकोण सरल और समझने में आसान है। OO को अनलिंक करने में कुछ समय लगता है, ऐसा लगता है :-)
तो यहाँ एक वस्तु और उदाहरण चर के साथ मेरा पिछला संस्करण है।
function DbConnection(sql, bindings, cb) {
this.sql = sql;
this.bindings = bindings;
this.cb = cb;
}
DbConnection.prototype.getConnection = function(err, conn) {
var self = this;
if (err) {
console.log("Error in DbConnection.getConnection: " + JSON.stringify(err));
this.cb(true);
return;
}
conn.query(this.sql, this.bindings, function(err, results) { self.query(err, results); });
}
DbConnection.prototype.query = function(err, results) {
var self = this;
if (err) {
console.log("Error in DbConnection.query: " + JSON.stringify(err));
self.cb(true);
return;
}
console.log("DbConnection results: " + JSON.stringify(results));
self.cb(false, results);
}
function with_connection(sql, bindings, cb) {
var dbc = new DbConnection(sql, bindings, cb);
pool.getConnection(function (err, conn) { dbc.getConnection(err, conn); });
}
यह पता चला है कि bind
कुछ लाभ के लिए इस्तेमाल किया जा सकता है। यह मुझे उन बदसूरत गुमनाम कार्यों से छुटकारा पाने की अनुमति देता है जो मैंने बनाई है जो कुछ भी नहीं करता है, सिवाय एक विधि कॉल के खुद को आगे बढ़ाने के लिए। मैं सीधे विधि पारित नहीं कर सकता क्योंकि यह गलत मूल्य के साथ शामिल था this
। लेकिन bind
, मैं this
जो चाहता हूं, उसका मूल्य निर्दिष्ट कर सकता हूं।
function DbConnection(sql, bindings, cb) {
this.sql = sql;
this.bindings = bindings;
this.cb = cb;
}
DbConnection.prototype.getConnection = function(err, conn) {
var f = this.query.bind(this);
if (err) {
console.log("Error in DbConnection.getConnection: " + JSON.stringify(err));
this.cb(true);
return;
}
conn.query(this.sql, this.bindings, f);
}
DbConnection.prototype.query = function(err, results) {
if (err) {
console.log("Error in DbConnection.query: " + JSON.stringify(err));
this.cb(true);
return;
}
console.log("DbConnection results: " + JSON.stringify(results));
this.cb(false, results);
}
// Get a connection from the pool, execute `sql` in it
// with the given `bindings`. Invoke `cb(true)` on error,
// invoke `cb(false, results)` on success. Here,
// `results` is an array of results from the query.
function with_connection(sql, bindings, cb) {
var dbc = new DbConnection(sql, bindings, cb);
var f = dbc.getConnection.bind(dbc);
pool.getConnection(f);
}
बेशक, इनमें से कोई भी उचित नहीं है जेएस नोड के साथ कोडिंग के साथ - मैंने अभी इस पर कुछ घंटे बिताए हैं। लेकिन शायद थोड़ा चमकाने के साथ यह तकनीक मदद कर सकती है?