← Back to jQuery Course | Chapter 4: Effects & Animations | Lesson 9 of 9

jQuery Callback Functions

कई jQuery effect methods, जैसे fadeOut() या slideUp(), instantly खत्म नहीं होते -- वे कुछ सौ milliseconds में animate होते हैं। अगर आप किसी को call करने के तुरंत बाद अगली line code चलाते हैं, तो वह code animation के असल में खत्म होने से पहले execute हो जाता है, जो किसी element को fade के बीच में हटाने या अभी तक settle न हुई size पढ़ने जैसे bugs का कारण बन सकता है। एक callback function इसे solve करता है: यह एक function है जिसे आप pass करते हैं और jQuery automatically इसे सिर्फ तभी चलाता है जब current effect पूरी तरह complete हो जाए।
Syntax
javascript
$(selector).method(arguments, function () {
  // callback runs after the method finishes
});

Effects को Callbacks की ज़रूरत क्यों है

fadeOut() और slideUp() जैसे jQuery effect methods asynchronous हैं -- किसी को call करना animation शुरू करता है और animation के खत्म होने का इंतज़ार किए बिना तुरंत आपके script की अगली line को control वापस दे देता है। अगर अगली line animation के complete होने पर निर्भर है (जैसे element हटाना या दूसरा animation शुरू करना), तो यह बहुत जल्दी चलेगी जब तक आप एक callback इस्तेमाल न करें।

Note: किसी effect method को "एक timer शुरू करना" समझें, "अपने code को pause करना" नहीं -- जो कुछ भी effect के बाद होना चाहिए उसे उसके callback के अंदर जाना चाहिए।
Warning: किसी effect call के ठीक बाद रखा गया code animation के अभी भी progress में रहते हुए चलता है, इसके खत्म होने के बाद नहीं।

उदाहरण: Why Effects Need Callbacks

javascript
<!DOCTYPE html>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  </head>
  <body>
    <div id="box">Box</div>
    <script>
      $("#box").fadeOut(1000);
      console.log("This runs immediately, before the fade finishes");
    </script>
  </body>
</html>

एक Callback Function Pass करना

एक callback को किसी effect method call के आख़िरी argument के रूप में जोड़ा जाता है -- fadeOut(1000, function() { ... }) -- और fade पूरी तरह खत्म होने पर jQuery automatically उस function को invoke करता है, बिना किसी manual timing या setTimeout की ज़रूरत के।

Note: callback functions को छोटा और सिर्फ अगले step पर focused रखें; अगर logic complex हो जाए, तो एक inline function के बजाय एक named function define करें।
Warning: function को parentheses के साथ call करना, जैसे fadeOut(1000, myFunc()), myFunc को तुरंत execute करता है और खुद function के बजाय उसकी return value pass करता है -- हमेशा bare function reference pass करें।

उदाहरण: Passing a Callback Function

javascript
<!DOCTYPE html>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  </head>
  <body>
    <div id="box">Box</div>
    <script>
      $("#box").fadeOut(1000, function() {
      console.log("Fade finished");
      });
    </script>
  </body>
</html>

किसी Callback के अंदर this इस्तेमाल करना

किसी callback function के अंदर, this keyword उस specific DOM element को refer करता है जिस पर effect लागू किया गया था, बिल्कुल किसी regular jQuery event handler के अंदर की तरह -- इसे $(this) के साथ wrap करना आपको animation complete होने के बाद उसी element के साथ normal jQuery methods इस्तेमाल करते हुए काम करते रहने देता है।

Note: जब भी आपको अपने ही callback के अंदर से animated element पर jQuery methods call करनी हों, this को $(this) में wrap करें।
Warning: callback के लिए एक arrow function इस्तेमाल करना यह बदल देता है कि this किसे refer करता है, क्योंकि arrow functions अपना खुद का this bind नहीं करते -- जब आपको this को animated element की तरफ़ point करना हो तो एक regular function() इस्तेमाल करें।

उदाहरण: Using this Inside a Callback

javascript
<!DOCTYPE html>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  </head>
  <body>
    <div id="box" data-name="mybox">Box</div>
    <script>
      $("#box").fadeOut(1000, function() {
      console.log($(this).data("name"));
      });
    </script>
  </body>
</html>

Callbacks के साथ कई Animations Chain करना

पहले effect के callback के अंदर एक दूसरा effect call nest करना एक simple sequence बनाता है: दूसरा animation सिर्फ तभी शुरू होता है जब पहला पूरी तरह खत्म हो चुका हो, आपको एक multi-step animated sequence (जैसे fade out, फिर slide up, फिर remove) बनाने देते हुए जो एक predictable, guaranteed order में चलता है।

Note: तीन या ज़्यादा chained animations की लंबी sequences के लिए, गहराई से nested callbacks के बजाय jQuery के Deferred/Promise objects पर विचार करें, जो पढ़ना मुश्किल हो सकते हैं।
Warning: कई callbacks को callbacks के अंदर गहराई से nest करना (कभी-कभी "callback hell" कहा जाता है) sequence बढ़ने के साथ code को धीरे-धीरे पढ़ना और debug करना मुश्किल बना देता है।

उदाहरण: Chaining Multiple Animations with Callbacks

javascript
<!DOCTYPE html>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  </head>
  <body>
    <div id="box">Box</div>
    <script>
      $("#box").slideUp(500, function() {
      $(this).fadeIn(500);
      });
    </script>
  </body>
</html>

Animation Effects से आगे Callbacks

callback pattern सिर्फ visual effects के लिए unique नहीं है -- कई दूसरी jQuery methods, जैसे $(document).ready(), $.getJSON(), और $.ajax(), भी अपना asynchronous काम खत्म होने पर चलाने के लिए एक function accept करती हैं। यहाँ callbacks समझना सीधे इस course में बाद में covered AJAX requests और deferred objects को समझने में काम आता है।

Note: callback pattern को एक general jQuery convention के रूप में पहचानें, कोई special animation-only feature नहीं -- वही "बाद में चलाने के लिए एक function pass करो" idea पूरी library में दिखता है।
Warning: यह मान लेना कि callbacks सिर्फ effects के लिए हैं बाद में AJAX और Deferred topics को अनजाना महसूस करा सकता है, जबकि वे असल में animations के बजाय network requests पर लागू किया गया वही underlying pattern हैं।

उदाहरण: Callbacks Beyond Animation Effects

javascript
<!DOCTYPE html>
<html>
  <head>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  </head>
  <body>
    <script>
      $(document).ready(function() {
      console.log("DOM ready callback ran");
      });
    </script>
  </body>
</html>
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. ऐसा code लिखना जो किसी animation call के तुरंत बाद उसके खत्म होने पर निर्भर करता है, उसके callback के अंदर लिखने के बजाय, race conditions पैदा करते हुए।
  2. यह भूल जाना कि callback के बिना, jQuery किसी effect के लिए रुकता या wait नहीं करता -- आपके script का बाकी हिस्सा animation के साथ parallel में तुरंत चलता रहता है।
  3. callback function को parentheses के साथ pass करना, जैसे fadeOut(myFunction()), जो jQuery को बाद में call करने के लिए एक reference pass करने के बजाय function को तुरंत call कर देता है।
चैप्टर सारांश
  • एक callback function किसी effect method के आख़िरी argument के रूप में pass की जाती है और उस effect के खत्म होने पर automatically चलती है।
  • callback के बिना, किसी effect call के तुरंत बाद वाला code animation पूरी होने के बाद नहीं, तुरंत चल जाता है।
  • Callbacks आमतौर पर actions की एक sequence chain करने के लिए इस्तेमाल होते हैं, जैसे दूसरा animation सिर्फ पहले के खत्म होने के बाद चलाना।
ब्राउज़र सपोर्ट

jQuery callback functions एक core language feature हैं (कोई browser API नहीं) और jQuery खुद जिस भी browser को support करता है उसमें identically काम करते हैं।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.