language agnostic - कॉलबैक फ़ंक्शन क्या है?




language-agnostic callback (13)

कॉलबैक फ़ंक्शन क्या है?


What is callback ?

  • an invitation to return for a second audition or interview.
  • a telephone call made to return one that someone has received.

A callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time.

What is a callback function ?

A callback function is a function that is passed to another function (let's call this other function otherFunction ) as a parameter, and the callback function is called (or executed) inside the otherFunction .


ओपेक परिभाषा

कॉलबैक फ़ंक्शन एक ऐसा फ़ंक्शन है जिसे आप कोड के दूसरे भाग में प्रदान करते हैं, जिससे उसे उस कोड द्वारा कॉल किया जा सकता है।

योगदान उदाहरण

तुमने ऐसा क्यों करना चाहोगे? आइए मान लें कि ऐसी सेवा है जिसे आपको आमंत्रित करने की आवश्यकता है। अगर सेवा तुरंत लौटती है, तो आप बस:

  1. इसे कहते हैं
  2. परिणाम के लिए प्रतीक्षा करें
  3. एक बार परिणाम आने पर जारी रखें

उदाहरण के लिए, मान लीजिए कि सेवा factorial फ़ंक्शन थी। जब आप 5! के मूल्य चाहते हैं 5! , आप factorial(5) आह्वान करेंगे, और निम्नलिखित कदम होंगे:

  1. आपका वर्तमान निष्पादन स्थान सहेजा गया है (ढेर पर, लेकिन यह महत्वपूर्ण नहीं है)

  2. निष्पादन factorial को सौंप दिया गया है

  3. जब factorial पूरा हो जाता है, तो यह परिणाम कहीं भी आपको प्राप्त कर सकता है

  4. निष्पादन वापस आता है जहां यह था [1]

अब मान लें कि factorial ने वास्तव में काफी समय लगाया है, क्योंकि आप इसे बड़ी संख्या दे रहे हैं और इसे कहीं भी कुछ सुपरकंप्यूटिंग क्लस्टर पर चलाने की जरूरत है। मान लीजिए कि आप अपने परिणाम को वापस करने में 5 मिनट लगने की उम्मीद करते हैं। आप ऐसा कर सकते हैं:

  1. जब आप सोते हैं तो अपना डिज़ाइन रखें और रात में अपना प्रोग्राम चलाएं, ताकि आप आधा समय स्क्रीन पर न देख रहे हों

  2. अपने कार्यक्रम को अन्य चीजों को करने के लिए डिज़ाइन करें जबकि factorial अपनी बात कर रहा है

यदि आप दूसरा विकल्प चुनते हैं, तो कॉलबैक आपके लिए काम कर सकता है।

अंत तक डिजाइन

कॉलबैक पैटर्न का फायदा उठाने के लिए, आप जो चाहते हैं वह निम्नलिखित तरीके से factorial कॉल करने में सक्षम होना है:

factorial(really_big_number, what_to_do_with_the_result)

दूसरा पैरामीटर, what_to_do_with_the_result , एक ऐसा फ़ंक्शन है जिसे आप factorial साथ भेजते हैं, उम्मीद है कि factorial इसे लौटने से पहले इसके परिणाम पर कॉल करेगा।

हां, इसका मतलब है कि कॉलबैक का समर्थन करने के लिए factorial जरूरतों को लिखा जाना चाहिए।

अब मान लीजिए कि आप अपने कॉलबैक में पैरामीटर पास करने में सक्षम होना चाहते हैं। अब आप नहीं कर सकते, क्योंकि आप इसे factorial , factorial है। इसलिए आपको अपने पैरामीटर को पास करने की अनुमति देने के लिए factorial जरूरतों को लिखा जाना चाहिए, और जब यह इसे आमंत्रित करता है तो यह उन्हें आपके कॉलबैक पर ही सौंप देगा। यह ऐसा दिखाई दे सकता है:

factorial (number, callback, params)
{
    result = number!   // i can make up operators in my pseudocode
    callback (result, params)
}

अब यह तथ्य इस पैटर्न को अनुमति देता है, आपका कॉलबैक इस तरह दिख सकता है:

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) रूप में छोटा हो सकता है print (2*a+1) । यदि आपकी भाषा की आवश्यकता है कि आप इसे एक अलग कार्य के रूप में परिभाषित करें, पूरी तरह से अनावश्यक नाम और हस्ताक्षर के साथ, तो यदि आप इस पैटर्न का उपयोग करते हैं तो आपका जीवन अप्रिय हो जाएगा।

यदि, दूसरी तरफ, आप भाषा आपको लैम्बडा बनाने की अनुमति देती है, तो आप बहुत बेहतर आकार में हैं। फिर आप कुछ लिखना समाप्त कर देंगे

f( func(a) { print(2*a+1); })

जो बहुत अच्छा है।

कॉलबैक कैसे पास करें

आप कॉलबैक फ़ंक्शन को factorial कैसे पास करेंगे? खैर, आप इसे कई तरीकों से कर सकते हैं।

  1. यदि कॉल किया गया फ़ंक्शन एक ही प्रक्रिया में चल रहा है, तो आप फ़ंक्शन पॉइंटर पास कर सकते हैं

  2. या हो सकता है कि आप अपने कार्यक्रम में fn name --> fn ptr का एक शब्दकोश बनाए रखना चाहते हैं, इस मामले में आप नाम पारित कर सकते हैं

  3. हो सकता है कि आपकी भाषा आपको लैम्ब्डा के रूप में संभवतः कार्य को परिभाषित करने की अनुमति दे! आंतरिक रूप से यह किसी प्रकार का ऑब्जेक्ट बना रहा है और पॉइंटर पास कर रहा है, लेकिन आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

  4. शायद आप जो फ़ंक्शन कॉल कर रहे हैं वह पूरी तरह से अलग मशीन पर चल रहा है, और आप HTTP प्रोटोकॉल जैसे नेटवर्क प्रोटोकॉल का उपयोग कर इसे कॉल कर रहे हैं। आप अपने कॉलबैक को HTTP-कॉल करने योग्य फ़ंक्शन के रूप में बेनकाब कर सकते हैं, और अपना यूआरएल पास कर सकते हैं।

तुम्हें नया तरीका मिल गया है।

कॉलबैक का हालिया वृद्धि

इस वेब युग में हमने प्रवेश किया है, हम जिन सेवाओं का आह्वान करते हैं वे अक्सर नेटवर्क पर होते हैं। हम अक्सर उन सेवाओं पर कोई नियंत्रण नहीं रखते हैं यानी हमने उन्हें नहीं लिखा है, हम उन्हें बनाए नहीं रखते हैं, हम यह सुनिश्चित नहीं कर सकते कि वे ऊपर हैं या वे कैसा प्रदर्शन कर रहे हैं।

लेकिन हम इन कार्यक्रमों को जवाब देने के लिए इंतजार कर रहे हैं, जबकि हम अपने कार्यक्रमों को अवरुद्ध करने की उम्मीद नहीं कर सकते हैं। इस बारे में जागरूक होने के कारण, सेवा प्रदाता अक्सर कॉलबैक पैटर्न का उपयोग करके एपीआई डिज़ाइन करते हैं।

जावास्क्रिप्ट बहुत अच्छी तरह से कॉलबैक का समर्थन करता है उदाहरण के लिए भेड़ के बच्चे और बंद के साथ। और ब्राउजर के साथ-साथ सर्वर पर जावास्क्रिप्ट की दुनिया में बहुत सी गतिविधियां हैं। मोबाइल के लिए भी जावास्क्रिप्ट प्लेटफॉर्म विकसित किए जा रहे हैं।

जैसे-जैसे हम आगे बढ़ते हैं, हम में से अधिक से अधिक एसिंक्रोनस कोड लिखेंगे, जिसके लिए यह समझ आवश्यक होगी।


आइए इसे सरल रखें। कॉल बैक फ़ंक्शन क्या है?

दृष्टांत और एनालॉजी द्वारा उदाहरण

मेरे पास एक सचिव है हर दिन मैं उससे पूछता हूं: (i) पोस्ट ऑफिस पर फर्म के आउटगोइंग मेल को छोड़ दें, और ऐसा करने के बाद , ऐसा करने के लिए: (ii) मैंने उन चिपचिपा नोटों में से किसी एक पर उनके लिए जो भी काम लिखा था।

अब, चिपचिपा नोट पर क्या काम है? कार्य दिन-प्रतिदिन भिन्न होता है।

मान लीजिए कि इस विशेष दिन पर, मुझे उसे कुछ दस्तावेजों को मुद्रित करने की आवश्यकता है। तो मैं इसे चिपचिपा नोट पर लिखता हूं, और मैं इसे अपने डेस्क पर पिन आउट करने के लिए बाहर जाने वाली आउटगोइंग मेल के साथ पिन करता हूं।

संक्षेप में:

  1. सबसे पहले, उसे मेल छोड़ना होगा और
  2. उसके तुरंत बाद , उसे कुछ दस्तावेजों को प्रिंट करने की जरूरत है।

कॉल बैक फ़ंक्शन वह दूसरा कार्य है: उन दस्तावेज़ों को प्रिंट करना। चूंकि यह मेल बंद होने के बाद किया जाता है, और यह भी क्योंकि चिपचिपा नोट उसे दस्तावेज मुद्रित करने के लिए कहता है उसे उस मेल के साथ दिया जाता है जिसकी उसे सबसे ज्यादा आवश्यकता होती है।

आइए अब इसे प्रोग्रामिंग शब्दावली के साथ जोड़ दें

  • इस मामले में विधि का नाम है: DropOffMail।
  • और कॉल बैक फ़ंक्शन है: प्रिंटऑफ दस्तावेज़। PrintOffDocuments कॉल बैक फ़ंक्शन है क्योंकि हम सचिव को ऐसा करना चाहते हैं, केवल DropOffMail के चलने के बाद ही।
  • तो मैं ड्रॉपऑफमेल विधि को "तर्क" के रूप में प्रिंटऑफ दस्तावेज़ों को पास कर दूंगा। यह एक महत्वपूर्ण बात है।

यह सब कुछ है। और कुछ नहीं। मुझे आशा है कि यह आपके लिए इसे साफ़ कर देगा - और यदि नहीं, तो एक टिप्पणी पोस्ट करें और मैं स्पष्ट करने के लिए अपनी पूरी कोशिश करूंगा।


इस सवाल का सरल जवाब यह है कि एक कॉलबैक फ़ंक्शन एक फ़ंक्शन होता है जिसे फ़ंक्शन पॉइंटर के माध्यम से बुलाया जाता है। यदि आप किसी फ़ंक्शन के पॉइंटर (पता) को दूसरे के लिए तर्क के रूप में पास करते हैं, तो जब उस पॉइंटर को फ़ंक्शन को कॉल करने के लिए उपयोग किया जाता है तो यह इंगित करता है कि एक कॉल बैक बनाया जाता है


एक कॉलबैक फ़ंक्शन एक फ़ंक्शन है जिसे आप किसी मौजूदा फ़ंक्शन / विधि में निर्दिष्ट करते हैं, जब कोई कार्य पूरा हो जाता है, अतिरिक्त प्रोसेसिंग आदि की आवश्यकता होती है।

जावास्क्रिप्ट में, या अधिक विशेष रूप से jQuery, उदाहरण के लिए, आप एक एनीमेशन समाप्त होने पर कॉलबैक तर्क निर्दिष्ट करने के लिए निर्दिष्ट कर सकते हैं।

PHP में, preg_replace_callback() फ़ंक्शन आपको एक फ़ंक्शन प्रदान करने की अनुमति देता है जिसे नियमित अभिव्यक्ति मिलान किया जाता है, तर्क के रूप में मिलान की गई स्ट्रिंग (ओं) को पारित किया जाता है।


एक कॉलबैक फ़ंक्शन जिसे उच्च-ऑर्डर फ़ंक्शन के रूप में भी जाना जाता है, एक ऐसा फ़ंक्शन है जो किसी अन्य फ़ंक्शन को पैरामीटर के रूप में पास किया जाता है, और कॉलबैक फ़ंक्शन को पैरेंट फ़ंक्शन के अंदर कॉल किया जाता है (या निष्पादित किया जाता है)।

$("#button_1").click(function() {
  alert("button 1 Clicked");
});

यहां हमने क्लिक विधि के पैरामीटर के रूप में एक फ़ंक्शन पास कर दिया है। और क्लिक विधि कॉलबैक फ़ंक्शन को कॉल (या निष्पादित) करेगा जिसे हमने पास किया था।


एक महत्वपूर्ण उपयोग क्षेत्र यह है कि आप अपने एक फ़ंक्शन को हैंडल (यानी कॉलबैक) के रूप में पंजीकृत करते हैं और फिर कुछ कार्य या प्रसंस्करण करने के लिए कुछ संदेश / संदेश भेजते हैं। अब प्रसंस्करण के बाद, बुलाया गया फ़ंक्शन हमारे पंजीकृत फ़ंक्शन को कॉल करेगा (यानी अब कॉल वापस किया गया है), इस प्रकार हमें संकेत मिलता है कि प्रसंस्करण किया जाता है।
यह विकिपीडिया लिंक ग्राफिकल रूप से काफी अच्छी तरह से बताता है।


छवि को देखो :)

मुख्य कार्यक्रम कॉलबैक फ़ंक्शन नाम के साथ लाइब्रेरी फ़ंक्शन (जो सिस्टम स्तर फ़ंक्शन भी हो सकता है) कॉल करता है। यह कॉलबैक फ़ंक्शन कई तरीकों से कार्यान्वित किया जा सकता है। मुख्य कार्यक्रम आवश्यकता के अनुसार एक कॉलबैक चुनते हैं।

अंत में, लाइब्रेरी फ़ंक्शन निष्पादन के दौरान कॉलबैक फ़ंक्शन को कॉल करता है।


ध्यान दें कि कॉलबैक एक शब्द है।

विकिपीडिया कॉलबैक पेज इसे बहुत अच्छी तरह बताता है।

विकिपीडिया पेज से उद्धरण:

कंप्यूटर प्रोग्रामिंग में, कॉलबैक निष्पादन योग्य कोड का संदर्भ है, या निष्पादन योग्य कोड का एक टुकड़ा है, जिसे अन्य कोड के लिए तर्क के रूप में पारित किया जाता है। यह एक निम्न-स्तरीय सॉफ़्टवेयर परत को उच्च-स्तरीय परत में परिभाषित एक सबराउटिन (या फ़ंक्शन) को कॉल करने की अनुमति देता है।


मान लें कि हमारे पास फ़ंक्शन 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)`   ...

यह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में पॉलिमॉर्फिज्म को प्राप्त करने में उपयोग की जाने वाली एक अवधारणा है


यह विधियों के अंत में वापसी बयानों की तरह कॉलबैक ध्वनि बनाता है।

मुझे यकीन नहीं है कि वे क्या हैं।

मुझे लगता है कि कॉलबैक वास्तव में एक समारोह के लिए एक कॉल है, जिसके परिणामस्वरूप किसी अन्य कार्य को लागू किया जा रहा है और पूरा किया जा रहा है।

मुझे यह भी लगता है कि कॉलबैक मूल आविष्कार को संबोधित करने के लिए हैं, "अरे! वह चीज़ जो आपने मांगी थी? मैंने यह किया है - मैंने सोचा कि मैं आपको बता दूंगा - आप पर वापस आना"।


टेलीफोन सिस्टम के संदर्भ में कॉलबैक का सबसे आसानी से वर्णन किया जाता है। एक फ़ंक्शन कॉल किसी को टेलीफोन पर कॉल करने, उसे एक प्रश्न पूछने, उत्तर देने और लटकने के समान है; कॉलबैक जोड़ना समानता को बदलता है ताकि उसे एक प्रश्न पूछने के बाद, आप उसे अपना नाम और संख्या भी दें ताकि वह आपको जवाब के साथ वापस बुला सके।

- पॉल Jakubik, "सी ++ में कॉलबैक कार्यान्वयन"


कॉल बेवकूफ नाम, कॉलबैक से बेहतर नाम होगा। किसी फ़ंक्शन के भीतर या जब स्थिति पूरी हो जाती है, तो फ़ंक्शन के बाद कॉल करें , जिसे तर्क के रूप में प्राप्त किया जाता है।

हार्ड-कोड को किसी फ़ंक्शन के भीतर एक आंतरिक फ़ंक्शन की बजाय, एक फ़ंक्शन लिखने के बाद पहले से लिखित कॉल को स्वीकार करने के लिए एक फ़ंक्शन लिखता है। तर्क प्राप्त करने वाले फ़ंक्शन में कोड द्वारा पता लगाए गए राज्य परिवर्तनों के आधार पर कॉल के बाद कॉल किया जा सकता है।





callback