कॉलबैक फ़ंक्शन क्या है?
कॉलबैक फ़ंक्शन क्या है?
जवाबों:
डेवलपर्स अक्सर भ्रमित होते हैं कि शापित चीज़ के नाम के कारण कॉलबैक क्या है।
कॉलबैक फ़ंक्शन एक फ़ंक्शन है जो है:
एक कॉलबैक फ़ंक्शन कैसे काम करता है, इसकी कल्पना करने का एक अच्छा तरीका यह है कि यह एक फ़ंक्शन है जिसे फ़ंक्शन के " बैक पर कॉल किया जाता है" इसे पास किया जाता है।
शायद एक बेहतर नाम एक "कॉल के बाद" फ़ंक्शन होगा।
यह निर्माण अतुल्यकालिक व्यवहार के लिए बहुत उपयोगी है जहां हम एक गतिविधि चाहते हैं जब भी कोई पिछली घटना पूरी हो जाए।
स्यूडोकोड:
// A function which accepts another function as an argument
// (and will automatically invoke that function when it completes - note that there is no explicit call to callbackFunction)
funct printANumber(int number, funct callbackFunction) {
printout("The number you provided is: " + number);
}
// a function which we will use in a driver function as a callback function
funct printFinishMessage() {
printout("I have finished printing numbers.");
}
// Driver method
funct event() {
printANumber(6, printFinishMessage);
}
परिणाम अगर आपने ईवेंट कहा है ():
The number you provided is: 6
I have finished printing numbers.
यहां आउटपुट का क्रम महत्वपूर्ण है। चूंकि कॉलबैक फ़ंक्शन को बाद में कहा जाता है, "मेरे पास प्रिंटिंग नंबर समाप्त हो गए हैं" अंतिम रूप से मुद्रित होता है, पहले नहीं।
कॉलबैक, पॉइंटर भाषाओं के साथ उपयोग के कारण तथाकथित हैं। यदि आप उनमें से एक का उपयोग नहीं करते हैं, तो 'कॉलबैक' नाम पर श्रम न करें। बस यह समझें कि यह एक विधि का वर्णन करने के लिए सिर्फ एक नाम है जो किसी अन्य विधि के लिए एक तर्क के रूप में आपूर्ति की जाती है, जैसे कि जब मूल विधि को बुलाया जाता है (जो भी स्थिति, जैसे कि बटन क्लिक, एक टाइमर टिक आदि) और इसकी विधि शरीर पूरा करती है, कॉलबैक फ़ंक्शन को तब लागू किया जाता है।
कुछ भाषाएं निर्माण का समर्थन करती हैं जहां कई कॉलबैक फ़ंक्शन तर्क समर्थित होते हैं, और यह इस आधार पर कहा जाता है कि मूल कार्य कैसे पूरा होता है (यानी एक कॉलबैक को उस घटना में कहा जाता है जो मूल फ़ंक्शन सफलतापूर्वक पूरा हो जाता है, दूसरे को उस इवेंट में बुलाया जाता है जो मूल फ़ंक्शन को फेंकता है विशिष्ट त्रुटि, आदि)।
once its parent method completes, the function which this argument represents is then called
। इसलिए यदि फ़ंक्शन को किसी अन्य फ़ंक्शन को तर्क के रूप में पास किया जाता है, लेकिन अभिभावक फ़ंक्शन के रनटाइम के बीच से बुलाया जाता है, parent(cb) {dostuff1(); cb(); dostuff2()}
तो इसे callback
फ़ंक्शन नहीं माना जाता है ?
कॉलबैक फ़ंक्शन एक फ़ंक्शन है जिसे आप कोड के किसी अन्य टुकड़े को प्रदान करते हैं, जिससे इसे उस कोड द्वारा कॉल किया जा सकता है।
तुमने ऐसा क्यों करना चाहोगे? मान लीजिए कि कोई ऐसी सेवा है जिसे आपको आमंत्रित करने की आवश्यकता है। यदि सेवा तुरंत लौटती है, तो आप बस:
उदाहरण के लिए, मान लें कि सेवा factorial
कार्य था। जब आप का मान चाहते हैं 5!
, तो आप आमंत्रित करेंगे factorial(5)
, और निम्न चरण होंगे:
आपका वर्तमान निष्पादन स्थान सहेजा गया है (स्टैक पर, लेकिन यह महत्वपूर्ण नहीं है)
निष्पादन के लिए सौंप दिया गया है factorial
जब factorial
पूरा हो जाता है, तो यह परिणाम कहीं न कहीं आप इसे प्राप्त कर सकते हैं
निष्पादन वापस उसी स्थान पर आता है जहां यह था [1]
अब मान लीजिए कि factorial
वास्तव में बहुत लंबा समय लगा, क्योंकि आप इसे भारी संख्या में दे रहे हैं और इसे किसी दिन सुपरकंप्यूटिंग क्लस्टर पर चलाने की आवश्यकता है। मान लें कि आपको अपना परिणाम वापस आने में 5 मिनट लगने की उम्मीद है। आप ऐसा कर सकते हैं:
अपना डिज़ाइन रखें और जब आप सो रहे हों तो रात में अपना प्रोग्राम चलाएं, ताकि आप आधे समय स्क्रीन पर न देखें
अन्य बातों के करने के लिए अपने कार्यक्रम डिजाइन, जबकि factorial
इसकी बात कर रही है
यदि आप दूसरा विकल्प चुनते हैं, तो कॉलबैक आपके लिए काम कर सकता है।
कॉलबैक पैटर्न का फायदा उठाने के लिए, आप जो चाहते हैं factorial
, निम्नलिखित तरीके से कॉल करने में सक्षम हैं :
factorial(really_big_number, what_to_do_with_the_result)
दूसरा पैरामीटर, what_to_do_with_the_result
एक ऐसा फ़ंक्शन है जिसे आप साथ भेजते हैं factorial
, इस उम्मीद में कि factorial
लौटने से पहले इसे अपने परिणाम पर बुलाएगा।
हां, इसका मतलब है कि factorial
कॉलबैक का समर्थन करने के लिए लिखा जाना चाहिए।
अब मान लीजिए कि आप अपने कॉलबैक में एक पैरामीटर पास करना चाहते हैं। अब आप नहीं कर सकते, क्योंकि आप इसे कॉल नहीं करने जा रहे हैं, factorial
है। इसलिए factorial
आपको अपने मापदंडों को पारित करने की अनुमति देने के लिए लिखा जाना चाहिए, और जब यह इसे लागू करेगा तो यह उन्हें आपके कॉलबैक में सौंप देगा। यह इस तरह लग सकता है:
factorial (number, callback, params)
{
result = number! // i can make up operators in my pseudocode
callback (result, params)
}
अब यह factorial
इस पैटर्न की अनुमति देता है, आपका कॉलबैक इस तरह दिख सकता है:
logIt (number, logger)
{
logger.log(number)
}
और आपका फोन factorial
होगा
factorial(42, logIt, logger)
यदि आप कुछ वापस करना चाहते हैं तो क्या होगा logIt
? खैर, आप नहीं कर सकते, क्योंकि इस factorial
पर ध्यान नहीं दिया जा रहा है।
ठीक है, क्यों नहीं factorial
वापस आ सकता है जो आपके कॉलबैक रिटर्न?
चूंकि निष्पादन factorial
समाप्त होने पर कॉलबैक को सौंप दिया जाता है, इसलिए यह वास्तव में अपने कॉलर को कुछ भी वापस नहीं करना चाहिए। और आदर्श रूप से, यह किसी तरह किसी अन्य थ्रेड / प्रक्रिया / मशीन में अपना काम शुरू करेगा और तुरंत वापस आ जाएगा ताकि आप जारी रख सकें, शायद कुछ इस तरह से:
factorial(param_1, param_2, ...)
{
new factorial_worker_task(param_1, param_2, ...);
return;
}
यह अब एक "अतुल्यकालिक कॉल" है, जिसका अर्थ है कि जब आप इसे कॉल करते हैं, तो यह तुरंत लौटता है लेकिन वास्तव में अभी तक अपना काम नहीं किया है। तो आपको इसकी जांच करने के लिए तंत्र की आवश्यकता है, और जब इसके समाप्त होने पर इसका परिणाम प्राप्त करना है, और आपके कार्यक्रम ने प्रक्रिया में अधिक जटिल हो गया है।
और वैसे, इस पैटर्न का उपयोग करके factorial_worker_task
आपके कॉलबैक को अतुल्यकालिक रूप से लॉन्च किया जा सकता है और तुरंत वापस आ सकता है।
जवाब कॉलबैक पैटर्न के भीतर रहना है। जब भी आप लिखना चाहते हैं
a = f()
g(a)
और f
इसे अतुल्यकालिक रूप से कहा जाएगा, आप इसके बजाय लिखेंगे
f(g)
जहां g
कॉलबैक के रूप में पारित किया गया है।
यह मूल रूप से आपके कार्यक्रम के प्रवाह-टोपोलॉजी को बदलता है , और कुछ की आदत डाल लेता है।
आपकी प्रोग्रामिंग लैंग्वेज आपको कार्यों को ऑन-द-फ्लाई करने का एक तरीका देकर आपकी बहुत मदद कर सकती है। ऊपर दिए गए कोड में, फ़ंक्शन g
जितना छोटा हो सकता है print (2*a+1)
। यदि आपकी भाषा की आवश्यकता है कि आप इसे एक अलग फ़ंक्शन के रूप में परिभाषित करते हैं, पूरी तरह से अनावश्यक नाम और हस्ताक्षर के साथ, तो इस पैटर्न का उपयोग करने पर आपका जीवन अप्रिय होने वाला है।
यदि, दूसरी ओर, आप भाषा से लैम्ब्डा बनाने की अनुमति देते हैं, तो आप बहुत बेहतर आकार में हैं। फिर आप कुछ इस तरह लिखेंगे
f( func(a) { print(2*a+1); })
जो बहुत अच्छा है।
आप कॉलबैक फ़ंक्शन को कैसे पास करेंगे factorial
? ठीक है, आप इसे कई तरीकों से कर सकते हैं।
यदि फ़ंक्शन समान प्रक्रिया में चल रहा है, तो आप फ़ंक्शन पॉइंटर पास कर सकते हैं
या हो सकता है कि आप fn name --> fn ptr
अपने कार्यक्रम का एक शब्दकोश बनाए रखना चाहते हैं , जिस स्थिति में आप नाम को पारित कर सकते हैं
हो सकता है कि आपकी भाषा आपको फ़ंक्शन को जगह में परिभाषित करने की अनुमति देती है, एक मेमने के रूप में संभव है! आंतरिक रूप से यह किसी प्रकार का ऑब्जेक्ट बना रहा है और एक पॉइंटर पास कर रहा है, लेकिन आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।
शायद आप जिस फ़ंक्शन को कॉल कर रहे हैं वह पूरी तरह से अलग मशीन पर चल रहा है, और आप इसे HTTP जैसे नेटवर्क प्रोटोकॉल का उपयोग करके कॉल कर रहे हैं। आप अपने कॉलबैक को HTTP- कॉल करने योग्य फ़ंक्शन के रूप में उजागर कर सकते हैं, और इसका URL पास कर सकते हैं।
तुम्हें नया तरीका मिल गया है।
इस वेब युग में हमने प्रवेश किया है, हम जिन सेवाओं को लागू करते हैं वे अक्सर नेटवर्क पर होती हैं। हमारा अक्सर उन सेवाओं पर कोई नियंत्रण नहीं होता है अर्थात हमने उन्हें नहीं लिखा था, हम उन्हें बनाए नहीं रखते हैं, हम यह सुनिश्चित नहीं कर सकते कि वे ऊपर हैं या वे कैसा प्रदर्शन कर रहे हैं।
लेकिन जब हम इन सेवाओं के जवाब के लिए इंतजार कर रहे हैं, तो हम अपने कार्यक्रमों को अवरुद्ध करने की उम्मीद नहीं कर सकते। इसके बारे में पता होने के नाते, सेवा प्रदाता अक्सर कॉलबैक पैटर्न का उपयोग करके एपीआई डिज़ाइन करते हैं।
लैम्बदास और क्लोजर के साथ जावास्क्रिप्ट बहुत अच्छी तरह से कॉलबैक का समर्थन करता है। और जावास्क्रिप्ट दुनिया में बहुत सारी गतिविधि है, दोनों ब्राउज़र पर और साथ ही सर्वर पर भी। यहां तक कि मोबाइल के लिए जावास्क्रिप्ट प्लेटफॉर्म भी विकसित किए जा रहे हैं।
जैसा कि हम आगे बढ़ते हैं, हम में से अधिक से अधिक अतुल्यकालिक कोड लिखेंगे, जिसके लिए यह समझ आवश्यक होगी।
ध्यान दें कि कॉलबैक एक शब्द है।
विकिपीडिया कॉलबैक पृष्ठ इसे बहुत अच्छी तरह से समझाता है।
विकिपीडिया पृष्ठ से उद्धरण:
कंप्यूटर प्रोग्रामिंग में, कॉलबैक निष्पादन योग्य कोड, या निष्पादन योग्य कोड का एक टुकड़ा है, जिसे अन्य कोड के तर्क के रूप में पास किया जाता है। यह निम्न-स्तरीय सॉफ़्टवेयर परत को उच्च-स्तरीय परत में परिभाषित सबरूटीन (या फ़ंक्शन) को कॉल करने की अनुमति देता है।
कॉलबैक फ़ंक्शन वह है जिसे किसी निश्चित स्थिति के पूरा होने पर कॉल किया जाना चाहिए। तुरंत कॉल किए जाने के बजाय, कॉलबैक फ़ंक्शन को भविष्य में एक निश्चित बिंदु पर बुलाया जाता है।
आमतौर पर इसका उपयोग तब किया जाता है जब एक कार्य शुरू किया जा रहा है जो अतुल्यकालिक रूप से समाप्त हो जाएगा (यानी कॉलिंग फ़ंक्शन वापस आने के बाद कुछ समय समाप्त हो जाएगा)।
उदाहरण के लिए, वेबपृष्ठ का अनुरोध करने के लिए एक फ़ंक्शन को कॉलबैक फ़ंक्शन प्रदान करने के लिए अपने कॉलर की आवश्यकता हो सकती है जिसे तब कॉल किया जाएगा जब वेबपेज ने डाउनलोड करना समाप्त कर दिया हो।
"...when a condition is met"
लेकिन मुझे लगा कि कॉलबैक तब कहलाते हैं जब पैरेंट फंक्शन निष्पादित होता है और वे शर्तों (?) पर निर्भर नहीं होते हैं।
टेलीफोन प्रणाली के संदर्भ में कॉलबैक का सबसे आसानी से वर्णन किया गया है। एक फ़ंक्शन कॉल किसी को टेलीफोन पर कॉल करने के लिए, उसे एक सवाल पूछने, एक उत्तर प्राप्त करने और फांसी देने के अनुरूप है; कॉलबैक जोड़ने से सादृश्य बदल जाता है ताकि उससे सवाल पूछने के बाद, आप उसे अपना नाम और नंबर भी दें ताकि वह आपको उत्तर के साथ वापस बुला सके।
- पॉल जैकबिक, "C ++ में कॉलबैक कार्यान्वयन"
मेरा मानना है कि इस "कॉलबैक" शब्दजाल का गलती से बहुत जगह उपयोग किया गया है। मेरी परिभाषा कुछ इस तरह होगी:
कॉलबैक फ़ंक्शन एक फ़ंक्शन है जिसे आप किसी को पास करते हैं और उसे किसी समय पर कॉल करते हैं।
मुझे लगता है कि लोग सिर्फ विकि परिभाषा का पहला वाक्य पढ़ते हैं:
कॉलबैक निष्पादन योग्य कोड या निष्पादन योग्य कोड का एक टुकड़ा है, जिसे अन्य कोड के तर्क के रूप में पास किया जाता है।
मैं बहुत सारे एपीआई के साथ काम कर रहा हूं, विभिन्न उदाहरण देखें। बहुत से लोग एक फ़ंक्शन पॉइंटर (निष्पादन योग्य कोड का एक संदर्भ) या अनाम फ़ंक्शन (निष्पादन योग्य कोड का एक टुकड़ा) "कॉलबैक" नाम देते हैं, यदि वे सिर्फ कार्य हैं तो आपको इसके लिए दूसरे नाम की आवश्यकता क्यों है?
वास्तव में विकि परिभाषा में केवल दूसरा वाक्य एक कॉलबैक फ़ंक्शन और एक सामान्य फ़ंक्शन के बीच के अंतर को प्रकट करता है:
यह निम्न-स्तरीय सॉफ़्टवेयर परत को उच्च-स्तरीय परत में परिभाषित सबरूटीन (या फ़ंक्शन) को कॉल करने की अनुमति देता है।
इसलिए यह अंतर है कि आप कौन से फंक्शन पास करने जा रहे हैं और आपके फंक्शन में कैसे पास होने वाले हैं। यदि आप किसी फ़ंक्शन को परिभाषित करते हैं और इसे किसी अन्य फ़ंक्शन में पास करते हैं और इसे सीधे उस फ़ंक्शन बॉडी में कहते हैं, तो इसे कॉलबैक न कहें। परिभाषा कहती है कि फंक्शन में आपका उत्तीर्ण होने वाला "लोअर-लेवल" फंक्शन कहलाता है।
मुझे उम्मीद है कि लोग अस्पष्ट संदर्भ में इस शब्द का उपयोग करना बंद कर सकते हैं, यह लोगों को केवल बदतर को बेहतर समझने में मदद नहीं कर सकता है।
चलो इसे सरल रखें। कॉल बैक फ़ंक्शन क्या है?
दृष्टांत और सादृश्य द्वारा उदाहरण
मेरे पास एक सचिव है। हर दिन मैं उससे पूछता हूं: (i) पोस्ट ऑफिस में फर्म के आउटगोइंग मेल को छोड़ दो, और उसके बाद उसने ऐसा किया है: करने के लिए: (ii) मैंने उन चिपचिपे नोटों में से एक पर उसके लिए जो भी कार्य लिखा था ।
अब, स्टिकी-नोट पर क्या कार्य है? यह कार्य दिन-प्रतिदिन बदलता रहता है।
मान लीजिए कि इस विशेष दिन पर, मुझे कुछ दस्तावेजों के प्रिंट आउट की आवश्यकता है। इसलिए मैं लिखता हूं कि वह स्टिकी नोट पर है, और मैं उसे अपने डेस्क पर पिन करता हूं और साथ ही बाहर जाने वाले मेल के साथ उसे पोस्ट करने की जरूरत है।
संक्षेप में:
कॉल बैक फ़ंक्शन वह दूसरा कार्य है: उन दस्तावेजों को प्रिंट करना। क्योंकि यह किया जाता है कि मेल को बंद कर दिया जाता है, और इसलिए भी क्योंकि दस्तावेज़ को प्रिंट करने के लिए उसे बताने वाला चिपचिपा नोट उसे डाक के साथ दिया जाता है जिसे उसे पोस्ट करने की आवश्यकता होती है।
अब इसे प्रोग्रामिंग शब्दावली के साथ टाई करते हैं
बस इतना ही है। और कुछ नहीं। मुझे आशा है कि आपके लिए इसे मंजूरी दे दी गई है - और यदि नहीं, तो एक टिप्पणी पोस्ट करें और मैं स्पष्ट करने की पूरी कोशिश करूंगा।
यह कॉलबैक को विधियों के अंत में रिटर्न स्टेटमेंट की तरह लगता है।
मुझे यकीन नहीं है कि वे क्या कर रहे हैं।
मुझे लगता है कि कॉलबैक वास्तव में एक फ़ंक्शन के लिए एक कॉल है, जिसके परिणामस्वरूप एक अन्य फ़ंक्शन को आमंत्रित किया और पूरा किया जा रहा है।
मुझे यह भी लगता है कि कॉलबैक मूल आह्वान को संबोधित करने के लिए है, एक तरह के "हे! उस चीज़ के लिए जो आपने पूछा है? मैंने ऐसा किया है - बस मैंने सोचा था कि मैं आपको बता दूंगा - आपके ऊपर वापस"।
कॉलबैक क्या है ?
कॉलबैक फ़ंक्शन क्या है ?
otherFunction
एक पैरामीटर के रूप में), और कॉलबैक फ़ंक्शन कहा जाता है (या मार डाला) के अंदर otherFunction
। function action(x, y, callback) {
return callback(x, y);
}
function multiplication(x, y) {
return x * y;
}
function addition(x, y) {
return x + y;
}
alert(action(10, 10, multiplication)); // output: 100
alert(action(10, 10, addition)); // output: 20
SOA में, कॉलबैक कंटेनर / वातावरण से प्लगइन्स मॉड्यूल को सेवाओं तक पहुंचने की अनुमति देता है।
सादृश्य: कॉलबैक। अतुल्यकालिक। कॉलबैक के लिए गैर-अवरुद्ध
वास्तविक जीवन उदाहरण
कॉल आफ्टर बेवकूफ नाम, कॉलबैक से बेहतर नाम होगा । जब या यदि किसी फ़ंक्शन के भीतर स्थिति मिलती है, तो किसी अन्य फ़ंक्शन को कॉल करें , फ़ंक्शन के बाद कॉल करें , जिसे एक तर्क के रूप में प्राप्त किया गया है।
किसी फ़ंक्शन के भीतर हार्ड-कोड के बजाय, एक व्यक्ति पहले से ही लिखित कॉल आफ्टर फ़ंक्शन को तर्क के रूप में स्वीकार करने के लिए एक फ़ंक्शन लिखता है । कॉल करने के बाद कहा जाता है हो सकता है राज्य परिवर्तन के आधार पर समारोह तर्क प्राप्त करने में कोड द्वारा पता लगाया।
कॉलबैक फ़ंक्शन एक फ़ंक्शन है जिसे आप किसी मौजूदा फ़ंक्शन / विधि को निर्दिष्ट करते हैं, जब कार्रवाई पूरी हो जाती है, तो अतिरिक्त प्रसंस्करण आदि की आवश्यकता होती है।
जावास्क्रिप्ट में, या अधिक विशेष रूप से jQuery में, उदाहरण के लिए, आप एक कॉलबैक तर्क को निर्दिष्ट कर सकते हैं जब एक एनीमेशन समाप्त हो गया है।
PHP में, preg_replace_callback()
फ़ंक्शन आपको एक फ़ंक्शन प्रदान करने की अनुमति देता है जिसे तब बुलाया जाएगा जब नियमित अभिव्यक्ति का मिलान किया जाता है, तर्कों के रूप में मिलान किए गए स्ट्रिंग (एस) को पास करना।
छवि देखें :)
मुख्य कार्यक्रम कॉलबैक फ़ंक्शन नाम के साथ लाइब्रेरी फ़ंक्शन (जो सिस्टम स्तर फ़ंक्शन भी हो सकता है) को कॉल करता है। यह कॉलबैक फ़ंक्शन कई तरीकों से लागू किया जा सकता है। मुख्य कार्यक्रम आवश्यकता के अनुसार एक कॉलबैक का चयन करता है।
अंत में, लाइब्रेरी फ़ंक्शन निष्पादन के दौरान कॉलबैक फ़ंक्शन को कॉल करता है।
इस प्रश्न का सरल उत्तर यह है कि कॉलबैक फ़ंक्शन एक फ़ंक्शन है जिसे फ़ंक्शन पॉइंटर के माध्यम से कहा जाता है। यदि आप किसी फ़ंक्शन के पॉइंटर (पता) को दूसरे के तर्क के रूप में पास करते हैं, जब उस फ़ंक्शन को कॉल करने के लिए उस पॉइंटर का उपयोग किया जाता है, तो यह कहा जाता है कि कॉल बैक किया गया है
मान लें कि हमारे पास एक फ़ंक्शन है sort(int *arraytobesorted,void (*algorithmchosen)(void))
जहां यह एक फ़ंक्शन पॉइंटर को अपने तर्क के रूप में स्वीकार कर सकता है जिसे किसी बिंदु पर sort()
कार्यान्वयन में उपयोग किया जा सकता है । फिर, यहां फ़ंक्शन पॉइंटर द्वारा संबोधित किए जाने वाले कोड algorithmchosen
को कॉलबैक फ़ंक्शन कहा जाता है ।
और लाभ देखें कि हम किसी भी एल्गोरिथ्म को चुन सकते हैं जैसे:
1. algorithmchosen = bubblesort
2. algorithmchosen = heapsort
3. algorithmchosen = mergesort ...
जो कहते हैं, प्रोटोटाइप के साथ लागू किए गए हैं:
1. `void bubblesort(void)`
2. `void heapsort(void)`
3. `void mergesort(void)` ...
यह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में बहुरूपता को प्राप्त करने के लिए उपयोग की जाने वाली अवधारणा है
"कंप्यूटर प्रोग्रामिंग में, कॉलबैक निष्पादन योग्य कोड या निष्पादन योग्य कोड का एक टुकड़ा है, जिसे अन्य कोड के तर्क के रूप में पास किया जाता है। यह निम्न-स्तरीय सॉफ़्टवेयर परत को उच्च-स्तरीय परत में परिभाषित सबरूटीन (या फ़ंक्शन) को कॉल करने की अनुमति देता है। " - विकिपीडिया
फ़ंक्शन सूचक का उपयोग करके C में कॉलबैक
C में, फ़ंक्शन पॉइंटर का उपयोग करके कॉलबैक लागू किया जाता है। फ़ंक्शन पॉइंटर - जैसा कि नाम से पता चलता है, एक फ़ंक्शन के लिए एक संकेतक है।
उदाहरण के लिए, int (* ptrFunc) ();
यहां, ptrFunc एक फ़ंक्शन का एक संकेतक है जो कोई तर्क नहीं लेता है और पूर्णांक देता है। कोष्ठक में रखना मत भूलना, अन्यथा संकलक मान लेंगे कि ptrFunc एक सामान्य फ़ंक्शन नाम है, जो कुछ भी नहीं लेता है और एक पूर्णांक के लिए एक संकेतक लौटाता है।
फ़ंक्शन पॉइंटर को प्रदर्शित करने के लिए यहां कुछ कोड दिए गए हैं।
#include<stdio.h>
int func(int, int);
int main(void)
{
int result1,result2;
/* declaring a pointer to a function which takes
two int arguments and returns an integer as result */
int (*ptrFunc)(int,int);
/* assigning ptrFunc to func's address */
ptrFunc=func;
/* calling func() through explicit dereference */
result1 = (*ptrFunc)(10,20);
/* calling func() through implicit dereference */
result2 = ptrFunc(10,20);
printf("result1 = %d result2 = %d\n",result1,result2);
return 0;
}
int func(int x, int y)
{
return x+y;
}
अब हम फ़ंक्शन पॉइंटर का उपयोग करके C में कॉलबैक की अवधारणा को समझने की कोशिश करते हैं।
पूर्ण कार्यक्रम में तीन फाइलें हैं: callback.c, reg_callback.h और reg_callback.c।
/* callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* callback function definition goes here */
void my_callback(void)
{
printf("inside my_callback\n");
}
int main(void)
{
/* initialize function pointer to
my_callback */
callback ptr_my_callback=my_callback;
printf("This is a program demonstrating function callback\n");
/* register our callback function */
register_callback(ptr_my_callback);
printf("back inside main program\n");
return 0;
}
/* reg_callback.h */
typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);
/* reg_callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
printf("inside register_callback\n");
/* calling our callback function my_callback */
(*ptr_reg_callback)();
}
यदि हम यह प्रोग्राम चलाते हैं, तो आउटपुट होगा
यह मुख्य कार्यक्रम के अंदर my_callback के अंदर register_callback के अंदर फ़ंक्शन कॉलबैक प्रदर्शित करने वाला एक प्रोग्राम है
उच्च परत फ़ंक्शन सामान्य कॉल के रूप में एक निचली परत फ़ंक्शन को कॉल करता है और कॉलबैक तंत्र किसी कॉलबैक फ़ंक्शन के लिए सूचक के माध्यम से उच्च परत फ़ंक्शन को कॉल करने की अनुमति देता है।
इंटरफ़ेस का उपयोग करके जावा में कॉलबैक
जावा में फंक्शन पॉइंटर की अवधारणा नहीं है। यह अपने इंटरफेस तंत्र के माध्यम से कॉलबैक तंत्र को लागू करता है। यहां फ़ंक्शन पॉइंटर के बजाय, हम एक इंटरफ़ेस की घोषणा करते हैं जिसमें एक विधि होती है जिसे कॉल किया जाता है जब कैली अपने कार्य को पूरा करता है।
मुझे एक उदाहरण के माध्यम से इसे प्रदर्शित करने दें:
कॉलबैक इंटरफ़ेस
public interface Callback
{
public void notify(Result result);
}
कॉलर या उच्च स्तर की कक्षा
public Class Caller implements Callback
{
Callee ce = new Callee(this); //pass self to the callee
//Other functionality
//Call the Asynctask
ce.doAsynctask();
public void notify(Result result){
//Got the result after the callee has finished the task
//Can do whatever i want with the result
}
}
कैली या निचली परत का कार्य
public Class Callee {
Callback cb;
Callee(Callback cb){
this.cb = cb;
}
doAsynctask(){
//do the long running task
//get the result
cb.notify(result);//after the task is completed, notify the caller
}
}
EventListener पैटर्न का उपयोग कर कॉलबैक
इस पैटर्न का उपयोग पर्यवेक्षकों / श्रोताओं के 0 से n संख्याओं को सूचित करने के लिए किया जाता है जो एक विशेष कार्य समाप्त हो गया है
कॉलबैक तंत्र और EventListener / ऑब्जर्वर तंत्र के बीच का अंतर यह है कि कॉलबैक में, कैलली सिंगल कॉलर को सूचित करता है, जबकि Eventlisener / ऑब्जर्वर में, कैलि उस व्यक्ति को सूचित कर सकता है जो उस ईवेंट में रुचि रखता है (अधिसूचना कुछ अन्य भागों में जा सकती है) अनुप्रयोग जिसने कार्य को ट्रिगर नहीं किया है)
इसे एक उदाहरण के माध्यम से समझाता हूं।
इवेंट इंटरफ़ेस
public interface Events {
public void clickEvent();
public void longClickEvent();
}
वर्ग विजेट
package com.som_itsolutions.training.java.exampleeventlistener;
import java.util.ArrayList;
import java.util.Iterator;
public class Widget implements Events{
ArrayList<OnClickEventListener> mClickEventListener = new ArrayList<OnClickEventListener>();
ArrayList<OnLongClickEventListener> mLongClickEventListener = new ArrayList<OnLongClickEventListener>();
@Override
public void clickEvent() {
// TODO Auto-generated method stub
Iterator<OnClickEventListener> it = mClickEventListener.iterator();
while(it.hasNext()){
OnClickEventListener li = it.next();
li.onClick(this);
}
}
@Override
public void longClickEvent() {
// TODO Auto-generated method stub
Iterator<OnLongClickEventListener> it = mLongClickEventListener.iterator();
while(it.hasNext()){
OnLongClickEventListener li = it.next();
li.onLongClick(this);
}
}
public interface OnClickEventListener
{
public void onClick (Widget source);
}
public interface OnLongClickEventListener
{
public void onLongClick (Widget source);
}
public void setOnClickEventListner(OnClickEventListener li){
mClickEventListener.add(li);
}
public void setOnLongClickEventListner(OnLongClickEventListener li){
mLongClickEventListener.add(li);
}
}
कक्षा बटन
public class Button extends Widget{
private String mButtonText;
public Button (){
}
public String getButtonText() {
return mButtonText;
}
public void setButtonText(String buttonText) {
this.mButtonText = buttonText;
}
}
क्लास चेकबॉक्स
public class CheckBox extends Widget{
private boolean checked;
public CheckBox() {
checked = false;
}
public boolean isChecked(){
return (checked == true);
}
public void setCheck(boolean checked){
this.checked = checked;
}
}
गतिविधि वर्ग
पैकेज com.som_itsolutions.training.java.exampleeventlistener;
public class Activity implements Widget.OnClickEventListener
{
public Button mButton;
public CheckBox mCheckBox;
private static Activity mActivityHandler;
public static Activity getActivityHandle(){
return mActivityHandler;
}
public Activity ()
{
mActivityHandler = this;
mButton = new Button();
mButton.setOnClickEventListner(this);
mCheckBox = new CheckBox();
mCheckBox.setOnClickEventListner(this);
}
public void onClick (Widget source)
{
if(source == mButton){
mButton.setButtonText("Thank you for clicking me...");
System.out.println(((Button) mButton).getButtonText());
}
if(source == mCheckBox){
if(mCheckBox.isChecked()==false){
mCheckBox.setCheck(true);
System.out.println("The checkbox is checked...");
}
else{
mCheckBox.setCheck(false);
System.out.println("The checkbox is not checked...");
}
}
}
public void doSomeWork(Widget source){
source.clickEvent();
}
}
अन्य वर्ग
public class OtherClass implements Widget.OnClickEventListener{
Button mButton;
public OtherClass(){
mButton = Activity.getActivityHandle().mButton;
mButton.setOnClickEventListner(this);//interested in the click event //of the button
}
@Override
public void onClick(Widget source) {
if(source == mButton){
System.out.println("Other Class has also received the event notification...");
}
}
मुख्य वर्ग
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Activity a = new Activity();
OtherClass o = new OtherClass();
a.doSomeWork(a.mButton);
a.doSomeWork(a.mCheckBox);
}
}
जैसा कि आप उपरोक्त कोड से देख सकते हैं, कि हमारे पास एक इंटरफ़ेस है, जिसे इवेंट कहा जाता है जो मूल रूप से उन सभी घटनाओं को सूचीबद्ध करता है जो हमारे एप्लिकेशन के लिए हो सकती हैं। विजेट वर्ग बटन, चेकबॉक्स जैसे सभी UI घटकों के लिए आधार वर्ग है। ये यूआई घटक ऑब्जेक्ट हैं जो वास्तव में फ्रेमवर्क कोड से घटनाओं को प्राप्त करते हैं। विजेट क्लास ईवेंट इंटरफ़ेस को लागू करता है और इसमें दो नेस्टेड इंटरफेस भी होते हैं जिनका नाम OnClickEventListener और OnLongClickEventListener है
ये दो इंटरफेस बटन या चेकबॉक्स जैसे विजेट व्युत्पन्न यूआई घटकों पर होने वाली घटनाओं को सुनने के लिए जिम्मेदार हैं। इसलिए यदि हम इस उदाहरण की तुलना जावा इंटरफेस का उपयोग करके पहले के कॉलबैक उदाहरण से करते हैं, तो ये दो इंटरफेस कॉलबैक इंटरफेस के रूप में काम करते हैं। तो उच्च स्तर का कोड (यहां गतिविधि) इन दो इंटरफेस को लागू करता है। और जब भी किसी विजेट पर कोई घटना घटती है, तो उच्च स्तरीय कोड (या उच्च स्तर कोड में लागू इन इंटरफेस की विधि, जो यहां गतिविधि है) को कहा जाएगा।
अब मुझे कॉलबैक और इवेंटलिस्टर पैटर्न के बीच बुनियादी अंतर पर चर्चा करने दें। जैसा कि हमने उल्लेख किया है कि कॉलबैक का उपयोग करते हुए, कैलली केवल एक ही कॉलर को सूचित कर सकता है। लेकिन EventListener पैटर्न के मामले में, एप्लिकेशन का कोई अन्य भाग या वर्ग बटन या चेकबॉक्स पर होने वाली घटनाओं के लिए पंजीकरण कर सकता है। इस तरह के वर्ग का उदाहरण अन्य क्लैक्सेस है। यदि आप OtherClass का कोड देखते हैं, तो आप पाएंगे कि इसने खुद को ClickEvent में एक श्रोता के रूप में पंजीकृत किया है जो गतिविधि में परिभाषित बटन में हो सकता है। दिलचस्प बात यह है कि गतिविधि (कॉलर) के अलावा, यह अन्य क्लॉस भी अधिसूचित किया जाएगा जब भी बटन पर क्लिक करने की घटना होती है।
कॉलबैक फ़ंक्शन एक फ़ंक्शन है जिसे आप एक निश्चित फ़ंक्शन या ऑब्जेक्ट के पास (एक संदर्भ या एक संकेतक के रूप में) पास करते हैं। यह फ़ंक्शन या ऑब्जेक्ट इस फ़ंक्शन को किसी भी समय, संभवतया कई बार, किसी भी तरह के उद्देश्य के लिए वापस बुलाएगा:
...
इसलिए कॉलबैक का वर्णन एक फ़ंक्शन के रूप में किया जा रहा है जिसे किसी अन्य फ़ंक्शन या कार्य के अंत में कॉल किया जा रहा है, यह अत्यधिक सरल है (भले ही यह एक सामान्य उपयोग हो)।
एक कॉलबैक एक फ़ंक्शन को दूसरे फ़ंक्शन के पैरामीटर के रूप में पारित करने का एक विचार है और प्रक्रिया पूरी होने के बाद यह एक है।
यदि आपको ऊपर दिए गए भयानक उत्तरों के माध्यम से कॉलबैक की अवधारणा मिलती है, तो मेरा सुझाव है कि आपको इसके विचार की पृष्ठभूमि सीखनी चाहिए।
"उन्हें (कंप्यूटर-वैज्ञानिकों) ने कॉलबैक विकसित किया है?" आप एक समस्या सीख सकते हैं, जो अवरुद्ध है। (विशेषकर यूआई को अवरुद्ध करना) और कॉलबैक इसका एकमात्र समाधान नहीं है। कई अन्य समाधान हैं (उदाहरण के लिए: थ्रेड, फ्यूचर्स, वादे ...)।
एक महत्वपूर्ण उपयोग क्षेत्र यह है कि आप अपने एक फ़ंक्शन को एक हैंडल (यानी एक कॉलबैक) के रूप में पंजीकृत करते हैं और फिर कुछ कार्य या प्रसंस्करण करने के लिए एक संदेश / कॉल भेजते हैं। अब प्रसंस्करण हो जाने के बाद, कहा जाता है कि फ़ंक्शन हमारे पंजीकृत फ़ंक्शन को कॉल करेगा (यानी अब कॉल बैक किया गया है), इस प्रकार हमें संकेत मिलता है कि प्रसंस्करण किया गया है।
यह विकिपीडिया लिंक रेखांकन को काफी अच्छी तरह से समझाता है।
एक कॉलबैक फ़ंक्शन, जिसे उच्च-क्रम फ़ंक्शन के रूप में भी जाना जाता है, एक फ़ंक्शन है जिसे किसी अन्य फ़ंक्शन को पैरामीटर के रूप में पास किया जाता है, और कॉलबैक फ़ंक्शन को पैरेंट फ़ंक्शन के अंदर (या निष्पादित) कहा जाता है।
$("#button_1").click(function() {
alert("button 1 Clicked");
});
यहां हमने क्लिक विधि के पैरामीटर के रूप में एक फ़ंक्शन पास किया है। और क्लिक विधि उस कॉलबैक फ़ंक्शन को कॉल करेगी (या निष्पादित करेगी) जिसे हमने पास किया था।
कॉलबैक फ़ंक्शन एक फ़ंक्शन जो एक तर्क के रूप में किसी अन्य फ़ंक्शन को दिया गया।
function test_function(){
alert("Hello world");
}
setTimeout(test_function, 2000);
नोट: उपर्युक्त उदाहरण में set_out फ़ंक्शन के तर्क के रूप में test_function का उपयोग किया जाता है।