आप <का उपयोग करके नेस्टेड डेटाबेस कॉल से छुटकारा पा सकते हैं। कोड>वादे ।
चूंकि आपने उल्लेख किया है कि आप mysql
का उपयोग कर रहे हैं
डेटाबेस के साथ बातचीत करने के लिए पुस्तकालय, दुर्भाग्य से, यह पुस्तकालय एक वादा-आधारित एपीआई प्रदान नहीं करता है। तो अपने कोड में नेस्टेड डेटाबेस कॉल से छुटकारा पाने के लिए, आपको डेटाबेस कॉल के कॉलबैक संस्करण के आसपास एक वादा-आधारित रैपर बनाना होगा।
वादे क्या हैं और वे कैसे काम करते हैं, इसके सामान्य अवलोकन के लिए, निम्न लिंक देखें:
निम्नलिखित एक उदाहरण है कि आप कैसे एक वादा-आधारित रैपर बना सकते हैं और फिर उस रैपर का उपयोग नेस्टेड डेटाबेस कॉल से छुटकारा पाने के लिए कर सकते हैं।
यह वादा-आधारित आवरण केवल एक फ़ंक्शन है जो एक वादा लौटाता है। यह एक वादा उदाहरण बनाता है, अंतर्निहित डेटाबेस कॉल को लपेटता है और अंततः जब डेटाबेस कॉल डेटा लौटाता है, तो यह आपके कोड को सूचित करता है।
function getCats() {
return new Promise((resolve, reject) => {
// make the database call
db.cats((error, cats) => {
// in case of an error, reject the promise by
// calling "reject" function
// Also pass the "error" object to the "reject" function
// as an argument to get access to the error message
// in the code that calls this "getCats" function
if (error) {
reject(error);
return;
}
// if there was no error, call "resolve" function
// to resolve the promise. Promise will be resolved
// in case of successful database call
// Also pass the data to "resolve" function
// to access this data in the code that calls this
// "getCats" function
resolve(cats);
});
});
}
अब आपके रूट हैंडलर फ़ंक्शन में, db.cats(...)
. को कॉल करने के बजाय , इसे कॉल करें getCats
आवरण समारोह।
वादे लौटाने वाले फ़ंक्शन को आप दो तरीकों से कॉल कर सकते हैं:
वादा-श्रृंखला
(विवरण के लिए, ऊपर बताए गए लिंक पर जाएं)async-प्रतीक्षा
सिंटैक्स (अनुशंसित)
निम्नलिखित कोड उदाहरण async-wait
का उपयोग करता है वाक्य - विन्यास। इसके लिए पहले रूट हैंडलर फंक्शन को async
. के रूप में चिह्नित करें async
. का उपयोग करके फ़ंक्शन
. से पहले कीवर्ड खोजशब्द। ऐसा करने से, हम प्रतीक्षित
use का उपयोग कर सकते हैं इस रूट हैंडलर फ़ंक्शन के अंदर कीवर्ड।
app.get('/pets', async function(req, res, next) {
try {
const cats = await getCats();
// similar wrappers for other database calls
const dogs = await getDogs();
const budgies = await getBudgies();
// render the pub template, passing in the data
// fetched from the database
...
catch (error) {
// catch block will be invoked if the promise returned by
// the promise-based wrapper function is rejected
// handle the error appropriately
}
});
उपरोक्त कोड उदाहरण केवल दिखाता है कि db.cats(...)
. को कैसे लपेटना है एक वादा-आधारित रैपर में डेटाबेस कॉल और डेटाबेस से डेटा प्राप्त करने के लिए उस रैपर का उपयोग करें। इसी तरह, आप db.dogs(...)
. के लिए रैपर बना सकते हैं और db.budgies(...)
कॉल।
प्रत्येक डेटाबेस कॉल के लिए एक अलग वादा-आधारित रैपर बनाने के बजाय, आदर्श रूप से, आपको एक पुन:प्रयोज्य वादा-आधारित रैपर फ़ंक्शन बनाना चाहिए जो कॉल करने के लिए एक फ़ंक्शन लेता है और उस फ़ंक्शन कॉल को एक वादे में लपेटता है जैसा कि उपरोक्त कोड उदाहरण में दिखाया गया है, यानी getCats
समारोह।
समानांतर डेटाबेस कॉल
मार्ग हैंडलर फ़ंक्शन में उपरोक्त कोड में ध्यान देने योग्य एक महत्वपूर्ण बात है
const cats = await getCats();
const dogs = await getDogs();
const budgies = await getBudgies();
यह है कि इससे अनुक्रमिक डेटाबेस कॉल आप जो चाहते हैं वह हो भी सकता है और नहीं भी।
यदि ये डेटाबेस कॉल एक-दूसरे पर निर्भर नहीं हैं, तो आप समानांतर में वादा-आधारित रैपर को Promise.all()
विधि।
निम्नलिखित कोड उदाहरण दिखाता है कि आप Promise.all()
का उपयोग करके अपने वादे-आधारित रैपर फ़ंक्शंस को समानांतर में कैसे कॉल कर सकते हैं ।
app.get('/pets', async function(req, res, next) {
try {
// "petsData" will be an array that will contain all the data from
// three database calls.
const petsData = await Promise.all([getCats(), getDogs(), getBudgies()]);
// render the pub template, passing in the data
// fetched from the database
...
catch (error) {
...
}
});
मुझे आशा है कि यह आपके वर्तमान कोड में नेस्टेड डेटाबेस कॉल से छुटकारा पाने और आपके कोड में वादों का उपयोग शुरू करने में आपकी सहायता करने के लिए पर्याप्त है।