অন্যরা প্রতিক্রিয়া জানানোর পরে, আপনি বলেছিলেন যে আপনার সমস্যাটি স্থানীয় পরিবর্তনশীল were এটি করার একটি সহজ উপায় বলে মনে হচ্ছে এটি স্থানীয় ভেরিয়েবলগুলি ধারণ করতে একটি বহিরাগত ফাংশন লিখুন, তারপরে নামকরণ করা অভ্যন্তরীণ ফাংশনগুলির একটি গোছা ব্যবহার করুন এবং নাম দ্বারা এগুলি অ্যাক্সেস করুন। আপনার একসাথে কতগুলি কার্যকারিতা প্রয়োজন তা নির্বিশেষে আপনি কেবল দুটি গভীর বাসা বাঁধবেন।
mysql
নীড়ের সাথে নোড.জেএস মডিউলটি ব্যবহার করার জন্য আমার নবাগতের চেষ্টা এখানে :
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);
}
আমি ভাবছিলাম যে সম্ভবত উদাহরণের ভেরিয়েবলগুলির সাহায্যে কোনও বস্তু তৈরি করা সম্ভব হবে এবং স্থানীয় ভেরিয়েবলগুলির প্রতিস্থাপন হিসাবে এই উদাহরণের ভেরিয়েবলগুলি ব্যবহার করা সম্ভব হবে। তবে এখন আমি দেখতে পেয়েছি যে নেস্টেড ফাংশন এবং স্থানীয় ভেরিয়েবলগুলি ব্যবহার করে উপরের পদ্ধতিটি সহজ এবং বোঝা সহজ। ও-কে প্রকাশ করতে কিছুটা সময় নেয়, দেখে মনে হয় :-)
সুতরাং এখানে একটি পূর্ববর্তী সংস্করণ একটি অবজেক্ট এবং উদাহরণ ভেরিয়েবল সঙ্গে।
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);
}
অবশ্যই, এর কোনওটিই নোড.জেএস কোডিংয়ের সাথে উপযুক্ত জেএস নয় - আমি এটিতে কয়েক ঘন্টা ব্যয় করেছি। তবে সম্ভবত কিছুটা পালিশ করে এই কৌশলটি সাহায্য করতে পারে?