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


684

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


8
आप यहां पा सकते हैं: stackoverflow.com/a/9652434/3343174 कॉलबैक के बारे में सबसे अच्छा स्पष्टीकरण
फखर


विस्तार विवरण के लिए दूसरा जवाब में देखो
Donato

कॉलबैक की सबसे अच्छी व्याख्या जो मैंने अब तक youtube.com/watch?v=xHneyv38Jro
समीर सिन्हा

जवाबों:


681

डेवलपर्स अक्सर भ्रमित होते हैं कि शापित चीज़ के नाम के कारण कॉलबैक क्या है।

कॉलबैक फ़ंक्शन एक फ़ंक्शन है जो है:

  • दूसरे फ़ंक्शन द्वारा पहुंच योग्य, और
  • यदि पहला फ़ंक्शन पूरा हो जाता है, तो पहले फ़ंक्शन के बाद इसे लागू किया जाता है

एक कॉलबैक फ़ंक्शन कैसे काम करता है, इसकी कल्पना करने का एक अच्छा तरीका यह है कि यह एक फ़ंक्शन है जिसे फ़ंक्शन के " बैक पर कॉल किया जाता है" इसे पास किया जाता है।

शायद एक बेहतर नाम एक "कॉल के बाद" फ़ंक्शन होगा।

यह निर्माण अतुल्यकालिक व्यवहार के लिए बहुत उपयोगी है जहां हम एक गतिविधि चाहते हैं जब भी कोई पिछली घटना पूरी हो जाए।

स्यूडोकोड:

// 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.

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

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

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


31
आपका उदाहरण बहुत अच्छा है लेकिन मैं यह नहीं देखता कि शब्दावली "कॉलबैक" क्यों है। जब अर्थऑफलाइफ "बैक कहा जाता है"?
कोडीबस्टीन

4
नमस्ते, के बारे में once its parent method completes, the function which this argument represents is then called। इसलिए यदि फ़ंक्शन को किसी अन्य फ़ंक्शन को तर्क के रूप में पास किया जाता है, लेकिन अभिभावक फ़ंक्शन के रनटाइम के बीच से बुलाया जाता है, parent(cb) {dostuff1(); cb(); dostuff2()}तो इसे callbackफ़ंक्शन नहीं माना जाता है ?
मैक्स यारी

2
@MaxYari: IMHO, इसे अभी भी कॉलबैक माना जाता है। यहां महत्वपूर्ण बात यह है कि पैरेंट फंक्शिन किसी तरह इनपुट फंक्शन (उर्फ कॉलबैक) का उपयोग करने जा रहा है। इसे बीच में या अंत में कहा जा सकता है या यदि कोई शर्त पूरी होती है।
कामरान बिगली

12
@ 8bitjunkie आपको धन्यवाद देता है - लेकिन प्रिंटऑनम्बर फ़ंक्शन के भीतर अर्थऑफलाइफ विधि कहाँ से मंगाई गई है?
BKSpurgeon

2
यह बिल्कुल भी सच नहीं है: "पहला फ़ंक्शन पूरा होने के बाद स्वचालित रूप से लागू किया जाता है"। कॉलबैक को बिल्कुल भी निष्पादित नहीं करना पड़ता है, स्वचालित रूप से अकेले जाने दें। वास्तव में, पैरेंट फ़ंक्शन पूरा होने से पहले कॉलबैक के लिए यह असामान्य नहीं है। मुझे बहुत नापसंद है कि कैसे लोग कॉलबैक को "बाद में" निष्पादित होने वाले कार्यों के रूप में वर्णित करते हैं। यह उन लोगों के लिए बहुत भ्रामक है जो उनके बारे में सीख रहे हैं। सीधे शब्दों में कहें तो कॉलबैक केवल ऐसे कार्य हैं जो अन्य कार्यों के तर्क के रूप में पारित किए जाते हैं। अवधि। एक बेहतर स्पष्टीकरण में फ़ंक्शन संदर्भों पर WHY कॉलबैक की व्याख्या करना शामिल होगा।
जॉर्डन

225

अपारदर्शी परिभाषा

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

उदाहरण दिया

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

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

उदाहरण के लिए, मान लें कि सेवा factorialकार्य था। जब आप का मान चाहते हैं 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 (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? ठीक है, आप इसे कई तरीकों से कर सकते हैं।

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

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

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

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

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

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

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

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

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

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


1
एक अवधारणा बहुत अच्छी तरह से समझाया ..! :)
पीयूष गोयल

महान व्याख्या, +1।
लिंगमूर्ति सीएस

1
यह अन्य सभी के बीच सबसे अच्छा जवाब है। कृपया इसे बढ़ाएँ।
अभिषेक नलिन

3
पूरी तरह से समझाया और सब कुछ समझाया गया है। काश मैं इसे फिर से उभार सकता।
योगेश यादव

हाँ मैं समझता हूँ कि मेमने जावास्क्रिप्ट और माणिक में कैसे काम करते हैं। और जावा 8 लेकिन जावा के पुराने संस्करणों में लैम्बस का उपयोग नहीं किया गया था और इसके बजाय इस्तेमाल की गई कक्षाएं थीं और मैं यह जानना चाहूंगा कि उस तरह के कॉलबैक कैसे काम करते हैं। फिर भी दूसरे से बेहतर जवाब।
डोनेटो

97

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

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

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

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


14
जवाब पेश करने का अच्छा तरीका।
चतुरंगा चंद्रशेखर

1
और यह भी एक अलग तरीके से जवाब की ओर जाता है। संज्ञा "कॉलबैक" वह है जिसे "वापस" कहा जाता है, उसी तरह कुछ जो शटडाउन के माध्यम से चला गया है उसे बंद कर दिया गया है और जो कुछ लॉग इन करने के लिए उपयोग किया जाता है वह एक लॉगिन है।
बेनामी

22
यह एक टिप्पणी हो सकती है - मूल रूप से यह विकिपीडिया की एक कड़ी है
CodyBugstein

विकिपीडिया को वास्तव में अपने ट्रॉव्स में कुछ बहुत बढ़िया प्रोग्रामिंग सामान मिला है। मुझे हमेशा ऐसा लगता था कि "कॉलबैक" शब्द को वाक्यांश का उपयोग करके सबसे अच्छा समझाया गया था, "मैं वापस कॉल करने जा रहा हूं ..."
थॉमस

Javascriptissexy.com/… पर शानदार व्याख्या; जो मैं यहाँ दूंगा; कॉलबैक फ़ंक्शन एक फ़ंक्शन है जो किसी अन्य फ़ंक्शन को पैरामीटर के रूप में पास किया जाता है, और कॉलबैक फ़ंक्शन को दूसरे फ़ंक्शन के अंदर कॉल या निष्पादित किया जाता है। // ध्यान दें कि क्लिक विधि के पैरामीटर में आइटम एक फ़ंक्शन है, चर नहीं। // आइटम कॉलबैक फ़ंक्शन $ ("# btn_1") है। क्लिक करें (फ़ंक्शन () {चेतावनी ("बीटीएन 1 क्लिक" );}); जैसा कि आप पूर्ववर्ती उदाहरण में देखते हैं, हम इसे निष्पादित करने के लिए क्लिक विधि के पैरामीटर के रूप में एक फ़ंक्शन पास करते हैं -
MarcoZen

46

एक आम आदमी की प्रतिक्रिया यह होगी कि यह एक ऐसा कार्य है जो आपके द्वारा नहीं बल्कि उपयोगकर्ता द्वारा या ब्राउज़र द्वारा किसी निश्चित घटना के बाद या कुछ कोड के संसाधित होने के बाद कहा जाता है।


42

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

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

उदाहरण के लिए, वेबपृष्ठ का अनुरोध करने के लिए एक फ़ंक्शन को कॉलबैक फ़ंक्शन प्रदान करने के लिए अपने कॉलर की आवश्यकता हो सकती है जिसे तब कॉल किया जाएगा जब वेबपेज ने डाउनलोड करना समाप्त कर दिया हो।


अपने पहले वाक्य में, आप कहते हैं, "...when a condition is met"लेकिन मुझे लगा कि कॉलबैक तब कहलाते हैं जब पैरेंट फंक्शन निष्पादित होता है और वे शर्तों (?) पर निर्भर नहीं होते हैं।
ओजोनुगा जुड ओचलिफु

'निश्चित स्थिति' का अर्थ है कि वे आम तौर पर एक कारण के लिए कहते हैं, बजाय यादृच्छिक पर। जब अभिभावक / निर्माता अभी भी निष्पादित कर रहे हैं, तो कॉलबैक कहा जा सकता है - यह एक दौड़ की स्थिति पैदा कर सकता है अगर प्रोग्रामर को इसकी उम्मीद नहीं है।
थॉमस ब्रैट

ठीक है। स्पष्टीकरण के लिए
धन्यवाद

34

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

- पॉल जैकबिक, "C ++ में कॉलबैक कार्यान्वयन"


1
तो मेरा नाम और नंबर एक फ़ंक्शन है?
कोरा तुगे

नहीं, अगर यह "कॉलबैक" के बजाय एक अच्छा नाम था, तो यह अनुरूप होगा: आप टेलीफोन ऑपरेटर को कॉल करने के लिए कहते हैं। समाप्त।
गेरसन

33

मेरा मानना ​​है कि इस "कॉलबैक" शब्दजाल का गलती से बहुत जगह उपयोग किया गया है। मेरी परिभाषा कुछ इस तरह होगी:

कॉलबैक फ़ंक्शन एक फ़ंक्शन है जिसे आप किसी को पास करते हैं और उसे किसी समय पर कॉल करते हैं।

मुझे लगता है कि लोग सिर्फ विकि परिभाषा का पहला वाक्य पढ़ते हैं:

कॉलबैक निष्पादन योग्य कोड या निष्पादन योग्य कोड का एक टुकड़ा है, जिसे अन्य कोड के तर्क के रूप में पास किया जाता है।

मैं बहुत सारे एपीआई के साथ काम कर रहा हूं, विभिन्न उदाहरण देखें। बहुत से लोग एक फ़ंक्शन पॉइंटर (निष्पादन योग्य कोड का एक संदर्भ) या अनाम फ़ंक्शन (निष्पादन योग्य कोड का एक टुकड़ा) "कॉलबैक" नाम देते हैं, यदि वे सिर्फ कार्य हैं तो आपको इसके लिए दूसरे नाम की आवश्यकता क्यों है?

वास्तव में विकि परिभाषा में केवल दूसरा वाक्य एक कॉलबैक फ़ंक्शन और एक सामान्य फ़ंक्शन के बीच के अंतर को प्रकट करता है:

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

इसलिए यह अंतर है कि आप कौन से फंक्शन पास करने जा रहे हैं और आपके फंक्शन में कैसे पास होने वाले हैं। यदि आप किसी फ़ंक्शन को परिभाषित करते हैं और इसे किसी अन्य फ़ंक्शन में पास करते हैं और इसे सीधे उस फ़ंक्शन बॉडी में कहते हैं, तो इसे कॉलबैक न कहें। परिभाषा कहती है कि फंक्शन में आपका उत्तीर्ण होने वाला "लोअर-लेवल" फंक्शन कहलाता है।

मुझे उम्मीद है कि लोग अस्पष्ट संदर्भ में इस शब्द का उपयोग करना बंद कर सकते हैं, यह लोगों को केवल बदतर को बेहतर समझने में मदद नहीं कर सकता है।


2
आपका जवाब समझ में आता है ... लेकिन मुझे यह चित्रित करने में परेशानी हो रही है। क्या आप एक उदाहरण दे सकते हैं?
CodyBugstein

3
@ ज़ेन वोंग :: अंतिम में आपने लिखा है "परिभाषा कहती है कि आपका उत्तीर्ण कार्य" निचले-स्तर के "फ़ंक्शन द्वारा कहा जाने वाला है। क्या आप बता सकते हैं कि निचले स्तर का कार्य क्या इंगित करता है? इसका बेहतर अगर आप एक उदाहरण दें।
वीकू

एक उदाहरण अच्छा लगा होगा
यूसुफ आजाद

1
मुझे लगता है कि शास्त्रीय फ़ंक्शन कॉल और कॉल-बैक शैली के बीच का अंतर भरोसेमंद दिशा से जुड़ा हुआ है: यदि मॉड्यूल A ("उपयोग करता है") मॉड्यूल B पर निर्भर करता है, A, B के फ़ंक्शन को कॉल करता है, तो यह कॉलबैक नहीं है। यदि A अपने फ़ंक्शन का संदर्भ B से देता है, तो B A के फ़ंक्शन को कॉल करता है, तो यह कॉलबैक है: कॉल मॉड्यूल निर्भरता की तुलना में पीछे जाती है।
XouDo

30

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

दृष्टांत और सादृश्य द्वारा उदाहरण

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

अब, स्टिकी-नोट पर क्या कार्य है? यह कार्य दिन-प्रतिदिन बदलता रहता है।

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

संक्षेप में:

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

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

अब इसे प्रोग्रामिंग शब्दावली के साथ टाई करते हैं

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

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


18

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

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

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

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


1
कॉलबैक बनाम रिटर्न स्टेटमेंट पर सवाल उठाने के लिए +1। मैं इससे बाहर निकलता था और कई ऐसे स्नातक करता था जिनके साथ मैं काम करता हूं।
8bitjunkie

2
अच्छा जवाब - मुझे कई अन्य उत्तरों के विपरीत समझने में मदद मिली!
अडाम

18

कॉलबैक क्या है ?

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

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

  • कॉलबैक फ़ंक्शन एक सेवक की तरह होता है जो अपने मास्टर को "कॉल बैक" करता है जब उसने एक कार्य पूरा किया हो।
  • एक कॉलबैक फ़ंक्शन एक समारोह है कि एक और कार्य करने के लिए पारित हो जाता है (चलो इस अन्य समारोह कॉल है 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 में, कॉलबैक कंटेनर / वातावरण से प्लगइन्स मॉड्यूल को सेवाओं तक पहुंचने की अनुमति देता है।

सादृश्य: कॉलबैक। अतुल्यकालिक। कॉलबैक के लिए गैर-अवरुद्ध
वास्तविक जीवन उदाहरण


कॉलबैक फ़ंक्शन अपने आप में एक उच्च-क्रम फ़ंक्शन नहीं है। इसे उच्च-क्रम फ़ंक्शन में पास किया जाता है।
डानियो

17

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

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


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

15

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

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

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


10

छवि देखें :)यह इस तरह काम करता है

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

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


7
क्या आप इस पर एक टेक्स्ट स्पष्टीकरण भी जोड़ेंगे ? यदि छवि गायब हो जाती है, तो यह उत्तर सभी संदर्भ खो देता है।
टिम पोस्ट

अन्य लोगों के पाठ इसे सर्वश्रेष्ठ बताते हैं। केवल एक चीज जो मुझे महसूस हो रही है, वह है छवि :)

सभी लंबे घुमावदार विवरणों में से मैंने यहां देखा है कि यह वही है जिसने मुझे "आह्ह्ह्ह" कर दिया, अब मैं इसका उपयोग देख रहा हूं। एक उत्थान है।
डायबोस्को

7

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


7

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

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


Javascriptissexy.com/… पर शानदार व्याख्या; जो मैं यहाँ दूंगा; कॉलबैक फ़ंक्शन एक फ़ंक्शन है जो किसी अन्य फ़ंक्शन को पैरामीटर के रूप में पास किया जाता है, और कॉलबैक फ़ंक्शन को दूसरे फ़ंक्शन के अंदर कॉल या निष्पादित किया जाता है। // ध्यान दें कि क्लिक विधि के पैरामीटर में आइटम एक फ़ंक्शन है, चर नहीं। // आइटम कॉलबैक फ़ंक्शन $ ("# btn_1") है। क्लिक करें (फ़ंक्शन () {चेतावनी ("बीटीएन 1 क्लिक" );}); जैसा कि आप पूर्व उदाहरण में देखते हैं, हम इसे निष्पादित करने के लिए क्लिक विधि के एक पैरामीटर के रूप में एक फ़ंक्शन पास करते हैं -
MarcoZen

4

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

फ़ंक्शन सूचक का उपयोग करके 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 में एक श्रोता के रूप में पंजीकृत किया है जो गतिविधि में परिभाषित बटन में हो सकता है। दिलचस्प बात यह है कि गतिविधि (कॉलर) के अलावा, यह अन्य क्लॉस भी अधिसूचित किया जाएगा जब भी बटन पर क्लिक करने की घटना होती है।


कृपया केवल उत्तरों से लिंक से बचें । उत्तर जो "किसी बाहरी साइट की लिंक से मुश्किल से अधिक हैं" को हटाया जा सकता है
क्वेंटिन

3

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

  • किसी कार्य के अंत में सूचित करना
  • दो आइटम के बीच तुलना का अनुरोध करना (जैसे c qort ())
  • एक प्रक्रिया की प्रगति की रिपोर्टिंग
  • घटनाओं को सूचित करना
  • किसी वस्तु के अस्थिरता को दर्शाना
  • एक क्षेत्र की पेंटिंग का प्रतिनिधित्व करना

...

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


2

एक कॉलबैक एक फ़ंक्शन को दूसरे फ़ंक्शन के पैरामीटर के रूप में पारित करने का एक विचार है और प्रक्रिया पूरी होने के बाद यह एक है।

यदि आपको ऊपर दिए गए भयानक उत्तरों के माध्यम से कॉलबैक की अवधारणा मिलती है, तो मेरा सुझाव है कि आपको इसके विचार की पृष्ठभूमि सीखनी चाहिए।

"उन्हें (कंप्यूटर-वैज्ञानिकों) ने कॉलबैक विकसित किया है?" आप एक समस्या सीख सकते हैं, जो अवरुद्ध है। (विशेषकर यूआई को अवरुद्ध करना) और कॉलबैक इसका एकमात्र समाधान नहीं है। कई अन्य समाधान हैं (उदाहरण के लिए: थ्रेड, फ्यूचर्स, वादे ...)।


1

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


1

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

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

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


1
कॉलबैक फ़ंक्शन अपने आप में एक उच्च-क्रम फ़ंक्शन नहीं है। इसे उच्च-क्रम फ़ंक्शन में पास किया जाता है।
डानियो

1

कॉलबैक फ़ंक्शन एक फ़ंक्शन जो एक तर्क के रूप में किसी अन्य फ़ंक्शन को दिया गया।

function test_function(){       
 alert("Hello world");  
} 

setTimeout(test_function, 2000);

नोट: उपर्युक्त उदाहरण में set_out फ़ंक्शन के तर्क के रूप में test_function का उपयोग किया जाता है।


1
ढेर अतिप्रवाह में आपका स्वागत है! एक प्रश्न का उत्तर देने से पहले, हमेशा मौजूदा उत्तर पढ़ें। यह उत्तर पहले ही प्रदान किया जा चुका है। उत्तर को दोहराने के बजाय, मौजूदा उत्तर को वोट करें। अच्छे उत्तर लिखने के लिए कुछ दिशानिर्देश यहां देखे जा सकते हैं
dferenc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.