हमें "कॉलबैक फ़ंक्शंस" की आवश्यकता क्यों है?


16

मैं किताब पढ़ रहा हूं programming in Lua। इसने कहा कि

क्लोजर कई संदर्भों में एक मूल्यवान उपकरण प्रदान करते हैं। जैसा कि हमने देखा है, वे उच्च-क्रम वाले कार्यों जैसे तर्क के रूप में उपयोगी हैं। क्लोजर उन कार्यों के लिए मूल्यवान हैं जो अन्य कार्यों का भी निर्माण करते हैं, जैसे कि हमारे newCounter उदाहरण; यह तंत्र लुआ कार्यक्रमों को कार्यात्मक दुनिया से परिष्कृत प्रोग्रामिंग तकनीकों को शामिल करने की अनुमति देता है। कॉलबैक फ़ंक्शंस के लिए भी क्लोज़र उपयोगी हैं। यहां एक विशिष्ट उदाहरण तब होता है जब आप पारंपरिक जीयूआई टूलकिट में बटन बनाते हैं। जब उपयोगकर्ता बटन दबाता है तो प्रत्येक बटन में कॉलबैक फ़ंक्शन होता है; जब आप दबाए जाते हैं तो आप अलग-अलग बटन चाहते हैं। उदाहरण के लिए, एक डिजिटल कैलकुलेटर को दस समान बटन की आवश्यकता होती है, प्रत्येक अंक के लिए एक। Y ou इस तरह के एक समारोह के साथ उनमें से प्रत्येक बना सकते हैं:

function digitButton (digit)
  return Button{label = tostring(digit),
                action = function ()
                  add_to_display(digit)
                  end}
end

ऐसा लगता है कि अगर मैं फोन digitButton, यह वापस आ जाएगी action(यह एक बंद पैदा करेगा), इसलिए, मैं उपयोग कर सकते हैं digitकरने के लिए पारित कर दिया digitButton

मेरा सवाल यह है कि:

Why we need call back functions? what situations can I apply this to?


लेखक ने कहा:

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

लेखक के अनुसार, मुझे लगता है कि एक समान उदाहरण इस प्रकार है:

function Button(t)
  -- maybe you should set the button here
  return t.action -- so that you can call this later
end

function add_to_display(digit)
  print ("Display the button label: " .. tostring(digit))
end

function digitButton(digit)
  return Button{label = tostring(digit),
                action = function ()
                           add_to_display(digit)
                           end}
end

click_action = digitButton(10)
click_action()

इस प्रकार, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.


जवाबों:


45

लड़के 1 से 2 लड़के: हे दोस्त मैं कुछ करना चाहता हूं जब कोई उपयोगकर्ता वहां क्लिक करता है, तो मुझे वापस बुलाएं जब वह ठीक हो जाए?

जब कोई उपयोगकर्ता यहां क्लिक करता है, तो लड़के 2 गाइ 1 को वापस बुलाता है।


1
मुझे यह कॉल-बैक मजाक बहुत पसंद है :-P
लुकास ली

6
यह सिर्फ मैं हूँ? मुझे नहीं पता कि यह कैसे बताता है कि हमें कॉलबैक फ़ंक्शन की आवश्यकता क्यों है।
प्रेत ० मी ० २13

2
यह लड़का 1 के गाइ 2 की तरह कहता है "जब समय सही हो तो ऐसा करो"। आदमी 2 अपने दिन के बारे में जाता है और जब समय सही होता है। यदि आप लड़के 1 को लड़के 2 का कॉलर कहते हैं, तो यह गलत है क्योंकि लड़के 2 को लड़का 1 नहीं कहता है, वह बात करने के लिए कहता है। वास्तव में अगर लड़का 1 लड़का 2 का कॉलर है तो आपको इस परिदृश्य में अपने हाथों पर एक कठिन लूप मिलेगा। अगर आपको गाइ 1 का मतलब कॉल बैक होना है तो यह गलत है क्योंकि कॉलबैक का कोई पता नहीं है कि गाइ 2 कौन है और निश्चित रूप से उसे कॉल करने के लिए नहीं कहता है।
जिस्म

यह एक भयानक व्याख्या है।
इंसाइडिन

21

नहीं, यह कभी भी कार्रवाई वापस नहीं करेगा । उपयोगकर्ता द्वारा उस पर क्लिक करने पर बटन इसे निष्पादित करेगा । और वह उत्तर है। जब आप किसी ऐसी घटना की प्रतिक्रिया में दूसरे घटक में घटित होने वाली क्रियाओं को परिभाषित करना चाहते हैं, जिसे आप नियंत्रित नहीं करते हैं (इवेंट लूप, जो सिस्टम का हिस्सा है, बटन की एक विधि निष्पादित करेगा, जो बारी-बारी से निष्पादित होगी। कार्य)।


मैं आपसे सहमत नहीं हूँ। मैंने अपनी पोस्ट संपादित की है और कुछ कोड जोड़े हैं। मुझे अभी भी लगता है कि कार्रवाई तुरंत निष्पादित नहीं की जाती है।
लुकास ली

2
टिम, आप सही कह रहे हैं - लेकिन जनवरी है। "बटन इसे निष्पादित करेगा जब उपयोगकर्ता उस पर क्लिक करता है", तुरंत नहीं।
अलेक्जेंडरब्रेविग

@AlexanderBrevig हाँ, मुझे अभी भी लगता है कि जन का जवाब मेरे लिए बहुत उपयोगी है। यह मुझे बताता है कि कॉल बैक क्या है और हमें कॉल बैक की आवश्यकता क्यों है।
लुकास ली

कॉलबैक केवल एक गंदा नाम है जिसे किसी दूसरे फ़ंक्शन में जोड़ा गया है जो पहले निकाल दिए जाने पर काम करता है और शायद एक मापदंड के आधार पर। अपने फ़ंक्शन को अच्छी तरह से कॉल करें_ऑन () और अंतर नहीं होगा। कॉलबैक वेरिफाई करने के लिए है, सत्यापन संदेशों का एक क्रम है, आमतौर पर दो, और कॉलबैक कार्यों की एक सीमा है, आमतौर पर दो। यदि आप 3 से अधिक कॉलबैक की अध्यक्षता करते हैं, तो बधाई देते हैं, आप चीजों को कठिन तरीके से करना पसंद करते हैं।
m3nda

16

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

AJAX कॉल अतुल्यकालिक है, जिसका अर्थ है कि यदि आप ऐसा कुछ करते हैं:

var ajax = ajaxCall();
if(ajax == true) {
  // Do something
}

ifब्लॉक की सामग्री मज़बूती से सही ढंग से नहीं चलेगी, और जब ऐसा होता है, तो यह केवल इसलिए होता है क्योंकि ajaxCall()निष्पादन के ifबयान तक पहुंचने से पहले फ़ंक्शन समाप्त हो गया था ।

हालाँकि, कॉलबैक इस समस्या को समाप्त करता है, यह सुनिश्चित करके कि आवश्यक फ़ंक्शन को कॉल करने से पहले अतुल्यकालिक कॉल समाप्त हो जाता है। तो, आपका कोड कुछ इस तरह से बदल जाएगा:

function ajaxCallback(response) {   
  if(response == true) {
    // Do something   
  }
}

ajaxCall(ajaxCallback);

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

इस क्रिया को देखने के लिए, आपको बस किसी भी वेबसाइट को देखने की आवश्यकता है जो पूरे पृष्ठ को फिर से लोड किए बिना किसी भी प्रकार का अपडेट करती है। Twitter, LinkedIn और StackExchange साइट इसके अच्छे उदाहरण हैं। ट्विटर की फीड्स की "अंतहीन स्क्रॉलिंग", और एसई की सूचनाएँ (दोनों उपयोगकर्ता सूचनाओं के लिए, और नोटिफिकेशन कि एक प्रश्न नई गतिविधि है), अतुल्यकालिक कॉल द्वारा संचालित हैं। जब आप एक स्पिनर को कहीं देखते हैं, तो इसका मतलब है कि उस खंड ने एक अतुल्यकालिक कॉल किया है, और उस कॉल के समाप्त होने की प्रतीक्षा कर रहा है, लेकिन आप इंटरफ़ेस पर अन्य चीजों के साथ बातचीत कर सकते हैं (और अन्य अतुल्यकालिक कॉल भी कर सकते हैं)। एक बार जब कॉल खत्म हो जाती है, तो यह प्रतिक्रिया करेगा और तदनुसार इंटरफ़ेस को अपडेट करेगा।


12

आपने प्रश्न पूछा

हमें "कॉल बैक फ़ंक्शंस" की आवश्यकता क्यों है?

मैं इसे संक्षिप्त और स्पष्ट तरीके से उत्तर देने का प्रयास करूंगा (यदि मैं इसमें विफल रहता हूं, तो कृपया इस उत्तर के निचले भाग में विकि लिंक देखें)।

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

बटन उदाहरण इस का एक अच्छा उदाहरण है। मान लें कि आप अपने एप्लिकेशन में एक बटन रखना चाहते हैं जो प्रिंटर पर एक पृष्ठ प्रिंट करता है, हम एक ऐसी दुनिया की कल्पना कर सकते हैं जहां आपको ऐसा करने के लिए एक पूरी नई PrinterButtonकक्षा को कोड करना होगा।

सौभाग्य से, हमारे पास कॉलबैक की धारणा है (विरासत और टेम्पलेट पैटर्न का उपयोग भी कॉलबैक अर्थ का एक प्रकार है) इसलिए हमें ऐसा करने की आवश्यकता नहीं है।

एक बटन के हर पहलू को फिर से लागू करने के बजाय, हम क्या करते हैं बटन के कार्यान्वयन में जोड़ना है। Buttonकर की अवधारणा है कुछ जब यह दबाया है। हम बस यह बताते हैं कि कुछ ऐसा क्या है।

व्यवहार को चौखटे में इंजेक्ट करने के उस तंत्र को कॉलबैक कहा जाता है।

उदाहरण:

आइए कुछ व्यवहार को HTML बटन में इंजेक्ट करें:

<button onclick="print()">Print page through a callback to the print() method</button>

इस उदाहरण में, onclickकॉलबैक की ओर इशारा करता है, जो इस उदाहरण के लिए print()विधि है।


http://en.wikipedia.org/wiki/Callback_(computer_programming)


धन्यवाद, आपका चित्रण पढ़ने के बाद, मैं विकि पढ़ने के लिए जाता हूँ, जिसके उदाहरण केवल तुल्यकालिक कॉलबैक हैं।
लुकास ली

एक समारोह में हर बार यह समस्या है और आप समस्याओं के लिए सुनना है एक जवाब बताओ; किसी समस्या को हल करने के लिए एक फ़ंक्शन सिखाना जो खुद का ख्याल रखता है।
जो

8

हमें कॉल बैक फ़ंक्शन की आवश्यकता क्यों है? मैं इसे किन स्थितियों में लागू कर सकता हूं?

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


1
+ यही कारण है कि कॉलबैक के लिए अच्छे हैं, लेकिन मुझे उन्हें लिखने से नफरत है :-)
माइक डनलवेई

जब मैं केवल एक फ्रेशमैन था, तो मेरे शिक्षक ने हमें MFC में प्रोग्राम करने का तरीका सिखाया, लेकिन उन्होंने हमें कभी नहीं बताया कि कॉलबैक क्या है :-(
लुकास ली

2

कॉलबैक के बिना क्या होता है:

आदमी 1: ठीक है, मैं उस चीज के होने का इंतजार कर रहा हूं। (सीटी, गमछा)

आदमी 2: दम! लड़का 1 मुझे सामान क्यों नहीं दिखा रहा है? मैं सामान होता हुआ देखना चाहता हूँ !! मेरा सामान कहाँ है? कैसे किसी को यहाँ आसपास कुछ भी प्राप्त करने के लिए माना जाता है?


1

फ़र्स्टऑफ़, कॉलबैक शब्द एक क्लोजर को संदर्भित करता है जिसका उपयोग किसी चीज़ के लिए किया जा रहा है।

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

लेकिन, मान लीजिए कि आप एक क्लोजर बनाते हैं और इसे कहीं स्टोर करते हैं कि जब कुछ होता है तो इसे कॉल किया जाएगा। इसे अब कॉलबैक कहा जाता है।

आमतौर पर, कॉलबैक प्रोग्राम के विभिन्न हिस्सों द्वारा बनाए गए पुर्जों की तुलना में होता है। इसलिए यह कल्पना करना आसान है कि कार्यक्रम के कुछ हिस्से दूसरे हिस्सों को "कॉल बैक" कर रहे हैं।

सीधे शब्दों में कहें तो कॉलबैक प्रोग्राम के एक हिस्से को कुछ होने पर (कुछ) करने के लिए दूसरे हिस्से को बताने की अनुमति देता है।

जैसे कि चरों का उपयोग बंद होने के कारण जीवित रखा जा रहा है, यह एक पूरी तरह से अलग विशेषता है, जिसे उवाउल्स कहा जाता है (उर्फ "स्थानीय चर के जीवनकाल का विस्तार", जो लुआ नहीं बोलते हैं)। और यह काफी उपयोगी भी है।


हाँ, Extending the lifetime of local variablesयह भी शब्द कहने के लिए है upvalue
लुकास ली

हां दिलचस्प। उत्थान शब्द Lua के लिए विशिष्ट प्रतीत होता है, हालांकि एक त्वरित Google खोज से पता चलता है कि इसका उपयोग कभी-कभी अन्य भाषाओं का वर्णन करने के लिए किया गया है। मैं इसे अपने उत्तर में जोड़ूंगा।
जोनाथन ग्रेफ

1

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

subroutine rungekutta(neq, t, tend, y, deriv)
  integer neq             ! number of differential equations
  double precision t      ! initial time
  double precision tend   ! final time
  double precision y(neq) ! state vector
  ! deriv is the callback function to evaluate the state derivative
  ...
  deriv(neq, t, y, yprime) ! call deriv to get the state derivative
  ...
  deriv(neq, t, y, yprime) ! call it several times
  ...
end subroutine

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


1

इस पर ठोकर खाई और तारीख जवाब के लिए एक और अधिक प्रदान करना चाहता था ...

कॉलबैक फ़ंक्शंस हमें बाद के समय में डेटा के साथ कुछ करने की अनुमति देते हैं , जिससे हमारे बाकी कोड को चलने की अनुमति मिलती है, बजाय इसके प्रतीक्षा करने के। अतुल्यकालिक कोड हमें बाद में कुछ भी निष्पादित करने के इस विलासिता की अनुमति देता है । मेरे द्वारा आए कॉलबैक फ़ंक्शंस का सबसे पठनीय उदाहरण जावास्क्रिप्ट में वादे हैं। हर बार नीचे दिए गए उदाहरण में आप फ़ंक्शन (परिणाम) या (newResult) या (FinalResult) देखें ... ये कॉलबैक फ़ंक्शन हैं। सर्वर से डेटा वापस आने के बाद उनके घुंघराले ब्रैकेट के भीतर कोड निष्पादित किया जाता है। केवल इस बिंदु पर इन कार्यों को निष्पादित करने के लिए समझ में आता है क्योंकि अब उन्हें आवश्यक डेटा उपलब्ध है।

doSomething().then(function(result) {
  return doSomethingElse(result);
})
.then(function(newResult) {
  return doThirdThing(newResult);
})
.then(function(finalResult) {
  console.log('Got the final result: ' + finalResult);
})
.catch(failureCallback);

कोड से लिया गया है ... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

उम्मीद है, यह किसी की मदद करता है। इसने मुझे कॉलबैक समझने में मदद की :)


1
ऐसा लगता है कि किए गए अंकों से अधिक कुछ भी नहीं दिया जा रहा है और पहले 9 जवाबों में समझाया गया है
gnat

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

-2

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

इसके कारण हम समानांतर संचालन करने के लिए कई थ्रेड का उपयोग करते हैं। जब हमें सर्वर से प्रतिक्रिया मिलती है तो हमें UI अपडेट करना होगा। हमें अपडेट करने के लिए उस थ्रेड से सूचित करना होगा। कार्यात्मक दुनिया से। इस प्रकार के फ़ंक्शन कॉल को कॉलबैक विधि कहा जाता है। जब आप इन विधियों को कॉल करते हैं, तो समोच्च को मुख्य धागे पर वापस लौटना चाहिए। उदाहरण के लिए कॉलबैक विधियाँ वस्तुनिष्ठ-सी में ब्लॉक हैं।


हाँ, आपने जो कहा वह पुस्तक पढ़ने के बाद मेरी समझ के अनुरूप है।
लुकास ली

2
कॉलबैक विधियां मल्टीथ्रेडिंग की तरह कुछ भी नहीं हैं। कॉलबैक मेथड्स केवल फंक्शन पॉइंटर्स (डेलिगेट्स) हैं। थ्रेड्स CPU संदर्भ स्विचिंग / उपयोग के बारे में हैं। एक अत्यधिक सरलीकृत कंट्रास्ट यह होगा कि थ्रेडिंग UX के लिए CPU ऑप्टिमाइज़ेशन के बारे में है जबकि कॉलबैक पॉलीमॉर्फिज़्म के लिए मेमोरी स्विचिंग के बारे में है। केवल इसलिए कि थ्रेड्स कॉलबैक निष्पादित कर सकते हैं इसका मतलब यह नहीं है कि थ्रेडिंग और कॉलबैक समान हैं। थ्रेड्स स्टैटिक क्लासेस पर भी स्टैटिक मेथड को अंजाम देते हैं लेकिन थ्रेडिंग और स्टैटिक टाइप समान नहीं होते हैं।
जिस्म
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.