मैं जावास्क्रिप्ट के लिए बिल्कुल नया हूं और मैं नोड में काम कर रहा हूं जिसके लिए एसिंक प्रोग्रामिंग और कॉलबैक डिज़ाइन की अच्छी समझ की आवश्यकता है। मैंने पाया है कि एम्बेडेड फ़ंक्शंस का उपयोग करना बहुत आसान है, भले ही आपके कॉलबैक कई स्तर गहरे हों। आपके एम्बेडेड कॉलबैक सिर्फ बंद होने के अंत में हैं।पुन: प्रयोज्य कॉलबैक फ़ंक्शंस को कैसे कार्यान्वित करें
हालांकि, जब आपके पास कॉलबैक की कई परतें होती हैं जहां कई कॉलबैक निष्पादित मार्गों के समान होते हैं, तो आप अलग-अलग कॉलबैक श्रृंखलाओं में बहुत से कॉलबैक कोड को फिर से लिखते हैं। उदाहरण के लिए, यदि नीचे mycb1 और mycb2 परिभाषाएं ए के बाहर स्थानांतरित की जाती हैं, तो उनके पास अब ए के चर के लिए अंतर्निहित पहुंच नहीं है और इस प्रकार, अब बंद होने के रूप में कार्य नहीं करते हैं।
एम्बेडेड परिभाषाओं के साथ उदाहरण जहां वे बंद होने के रूप में कार्य करते हैं।
mod.A=function(){
var mycb1=function(err){
if (!err){
var mycb2=function(err){
cb(err);
};
mod.foo2(args,mycb2);
}
else{cb(err);}
};
mod.foo1(args,mycb1);
}
mod.foo1 = function(args,cb){
//do some work
cb(err);
};
mod.foo2 = function(args,cb){
//do some work
cb(err);
}
//execute
mod.A();
मैं तो निम्न कार्य करें, लेकिन अभी वे जहां कभी वे कहा जाता है से बंद के रूप में इस्तेमाल किया जा सकता mycb1 और mycb2 कार्यों के लिए चर गुंजाइश को बदलने में सक्षम होना चाहता हूँ। उदाहरण के लिए:
var mycb2=function(err){
...
cb(err);
};
var mycb1=function(err){
if (!err){
mod.foo2(args,mycb2); //but have it act like a closure to mycb1
}
else{cb(err);}
};
mod.A=function(){
...
mod.foo1(args,mycb1); //but have it act like a closure to A
}
mod.foo1 = function(args,cb){
//do some work
cb(err);
}
mod.foo2 = function(args,cb){
//do some work
cb(err);
}
मुझे पता है कि मैं एक डिजाइन है कि या तो आधुनिक स्तर पर चर सेट ताकि वे आधुनिक स्तर के कार्यों के लिए उपलब्ध हैं लागू कर सकते हैं। हालांकि, ऐसा लगता है कि यह चर के साथ मॉड स्कोप को कुछ हद तक प्रदूषित करता है जिसका उपयोग केवल कुछ तरीकों से किया जा सकता है। मुझे यह भी पता है कि जब वे निष्पादित होते हैं तो कॉलबैक के लिए उन्हें सुलभ बनाने के लिए वे वेरिएबल में पास हो सकते हैं। हालांकि, अगर मैं समझता हूं कि जेएस और कॉलबैक कैसे काम करते हैं, तो मुझे उन्हें fooX में पास करना होगा और फिर उन्हें कॉलबैक पर पास करना होगा। यह या तो एक अच्छी योजना की तरह प्रतीत नहीं होता है। क्या फ़ंक्शन का परिवर्तनीय दायरा बदला जा सकता है, इसलिए यह परिभाषा के बिंदु के बजाय निष्पादन के बिंदु से बंद होने जैसा कार्य करता है? यदि नहीं, तो आपके कॉलबैक कोड को मॉड्यूलर करने का सबसे अच्छा तरीका क्या है ताकि इसे पुन: उपयोग किया जा सके?
आप रन-टाइम पर ज्ञात कॉलबैक में ज्ञात मानों को सीमेंट करने के लिए Function.bind() का उपयोग कर सकते हैं। यह "निष्पादन के बिंदु से बंद होने" के करीब है, जैसा कि यह आपको सही ढंग से समझता है। – dandavis
आप अत्यधिक भीड़ मॉड्यूल बंद होने के बिना राज्य को जारी रखने के लिए वादे का उपयोग कर सकते हैं – dandavis
उत्कृष्ट सलाह। धन्यवाद। – rss181919