आस्थगित कॉलबैक क्या हैं?


15

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

मैं गुमराह करने के बाद भी आस्थगित कॉलबैक को समझने के लिए संघर्ष कर रहा हूं।

कृपया कोई सरल स्पष्टीकरण दे सकता है? मैं रूबी में कार्यक्रम करता हूं, लेकिन सी / सी ++ को भी थोड़ा जानता हूं, लेकिन सबसे ज्यादा मैं एक अनुभवी विधानसभा भाषा प्रोग्रामर था। तो मैं सोच रहा हूँ कि क्या यह कॉलबैक पतों के ढेर की तरह है जो कि पॉप-अप प्राप्त करते हैं? मैं jquery या node.js सीखने की उम्मीद कर रहा हूं और ये आस्थगित कॉलबैक दोनों के लिए अभिन्न लगते हैं। मैं बुनियादी सूत्रण सिद्धांतों को समझता हूं (हालांकि म्यूटेक्स ऑब्जेक्ट मेरे सिर को चोट पहुंचाता है;)


क्या आपका मतलब है jQuery की Deferredवस्तुएं? क्या यह Node.js के लिए कुछ विशिष्ट है?
bfavaretto

1
नहीं, मेरा सामान्य अर्थ है। हालांकि मैं jquery और संभवतः नोड सीखना चाहता हूं। मुझे लगता है कि मुझे इस बात की आवश्यकता है कि वास्तव में एक आस्थगित कॉलबैक क्या है। मैंने कॉलबैक पर विकिपीडिया लेख पढ़ा, लेकिन मुझे आस्थगित कॉलबैक की समझ नहीं मिली, जो अतुल्यकालिक ऑपरेशन के प्रतिमान के लिए आंतरिक लगता है जो इन भाषाओं में शामिल होगा जो इसका उपयोग करते हैं।


1
मैं वास्तव में उनके कार्यान्वयन के विरोध में आस्थगित कॉलबैक के वैचारिक विचार के लिए पूछ रहा हूं - माफ करना अगर मैंने इसे और अधिक स्पष्ट नहीं किया। मैंने इस विचार को स्पष्ट करने के लिए भाषा के उदाहरण दिए हैं कि मैं अपनी प्रोग्रामिंग पृष्ठभूमि को स्पष्ट करने की कोशिश कर रहा हूं और इसलिए कि लोगों को पता होगा कि उत्तर कैसे देना है। अब तक के उत्तर के लिए बहुत बहुत धन्यवाद - मैं वहां पहुंच रहा हूं!
tentimes

ठीक है, मुझे लगता है कि मुझे यह अब मिल गया है दोस्तों, आप सभी को धन्यवाद! हालांकि मुझे नहीं पता कि जवाब देने का क्या तरीका है। कैमरन ने इस अवधारणा को सबसे सरल रूप से समझाया और यही मैं वास्तव में उसके बाद था, लेकिन अन्य लोगों ने भी इसमें भाग लिया और अपने ज्ञान में जोड़ा। मुझे यकीन है कि नहीं किस तरह से जवाब को स्वीकार करने के रूप में मैं इस के लिए नया हूँ हूँ;)
tentimes

जवाबों:


4

अनुरोध के अनुसार, यहां उत्तर के रूप में प्रस्तुत टिप्पणियां हैं:


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

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

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

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

यह तथ्य कि अंतर्निहित प्रणाली ईवेंट-चालित है, आस्थगित कॉलबैक के उपयोग के लिए ऑर्थोगोनल है; आप नोड के एक बहुत (बहुत धीमे) संस्करण की कल्पना कर सकते हैं। जो कि हर ऑपरेशन के लिए एक धागा शुरू करता है, और फिर आपके दिए गए कॉलबैक को कॉल करता है जब थ्रेड ने अपना काम पूरा किया, बिना घटनाओं का उपयोग किए। बेशक, यह एक भयानक मॉडल है, लेकिन यह मेरी बात को दिखाता है :-)


8

हर बार जब आप कॉलबैक जोड़ते हैं तो आस्थगित कॉलबैक काम करता है, उस कॉलबैक को एक सरणी में धकेल दिया जाता है। फिर, जब .resolve()या .resolveWith()विधि को आस्थगित ऑब्जेक्ट पर कॉल किया जाता है, .done()तो सरणी में सभी कॉलबैक को क्रम में निष्पादित किया जाता है।

अब हम देख सकते हैं कि एक आस्थगित वस्तु क्या है। एक उदाहरण के रूप में नीचे स्निपेट लें।

var deferred = $.Deferred();
var promise = deferred.promise();

हमारे पास अब एक आस्थगित वस्तु है, और आस्थगित वस्तु का वादा वस्तु है। स्थगित वस्तु सब वादा वस्तु के रूप में एक ही तरीके का है लेकिन वादा वस्तु केवल तरीकों है, .done(), .fail(), और .always()जो प्रत्येक संबंधित के लिए स्थगित कर वस्तु के लिए कॉलबैक जोड़ने के लिए उपयोग किया जाता है event। दूसरी ओर आस्थगित वस्तु के कई अन्य तरीके हैं, सबसे महत्वपूर्ण .resolve()और .reject()। जब इन विधियों को आस्थगित ऑब्जेक्ट पर कॉल किया जाता है, तो सभी कॉलबैक कहा जाता है। .resolve()आग .done()और .always()जबकि कॉलबैक .reject()विधि कॉल .fail()और .always()कॉलबैक।

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

यहाँ एक और उदाहरण है, एक जो मैं उपयोग करता हूं:

function loadImage(url) {
    var def = $.Deferred(),
        img = new Image();
    $(img).on("load error",function(e){
        if (e.type === "error") {
            def.reject(url);
        }
        else {
            def.resolve(url);
        }
    });
    img.src = url;
    // return the promise object so that callbacks can
    // be defined on the deferred object.
    return def.promise();
}
loadImage("foobar.jpg").done(function(){
    alert("The image is loaded!");
}).fail(function(){
    alert("The image failed to load!");
}).always(function(){
    alert("This is always called!");
});

JQuery की $.Deferred()विधि और आस्थगित वस्तुओं के बारे में अधिक जानकारी के लिए , http://api.jquery.com/category/deferred-object/ पर जाएँ


एक बार आस्थगित कॉलबैक की अवधारणा में अपना सिर घुमाने के बाद यह शायद अमूल्य होगा। क्षमा करें, लेकिन मुझे अभी भी इस अवधारणा की समझ नहीं है कि आस्थगित कॉलबैक क्या है। मैं इसके पीछे वैचारिक विचार की तलाश में हूं। मिहिया के विचार के साथ क्रमबद्ध करें। एक बार जब मैं अपना सिर गोल कर सकता हूं तो शायद मैं जेएस को समझ सकता हूं।
तंबू

3

मुझे यकीन नहीं है, लेकिन मेरा मानना ​​है कि एक विकृत कॉलबैक एक अतुल्यकालिक कॉलबैक को संदर्भित करता है, इसलिए आपके पास इसके लिए बेहतर किस्मत होगी।

मुझे सबसे अच्छा स्पष्टीकरण http://www.nodebeginner.org पर मिला

हे, शायदExpensiveFunction (), कृपया अपना सामान करें, लेकिन मैं, एकल Node.js धागा, यहीं खत्म होने तक इंतजार नहीं करूंगा, जब तक आप नीचे दिए गए कोड की पंक्तियों को निष्पादित करना जारी रखेंगे, तो आप इसे ले जाएंगे यह कॉलबैकफ़ंक्शन () यहाँ है और इसे कॉल करें जब आप अपना महंगा सामान पूरा कर रहे हैं? धन्यवाद!"

इस उदाहरण में, शायदExpensiveFunction एक गैर-अवरोधक (या async फ़ंक्शन) है। इसका मतलब यह है कि इसे तुरंत निष्पादित नहीं किया गया है, लेकिन एक तथाकथित इवेंट लूप में रखा गया है। नोड.जेएस थ्रेड निष्पादन जारी रखेगा, लेकिन कुछ समय में, यह इवेंट लूप से कुछ निष्पादित करने का निर्णय करेगा। जब यह शायदExpensiveFunction तक पहुँचता है, तो इसे कॉल करता है, और जब शायदExpensiveFunction निष्पादन को समाप्त करता है, तो यह (deferred) कॉलबैक को एक पैरामीटर के रूप में पारित करता है।

शायद ExExistentFunction के एक उदाहरण के रूप में आप fs.readFile ले सकते हैं


धन्यवाद। लेकिन, अगर यह पहले से ही वापस आ गया है और आप निष्पादन के मुख्य धागे में वापस आ गए हैं, तो यह कैसे महंगा कार्य करने जा रहा है? मुझे वह नहीं मिलता है। क्या आप कह रहे हैं कि यह समाप्त होने के बाद फ़ंक्शन किसी तरह से बना रहता है?

उत्तर को संपादित किया, शायद अब यह स्पष्ट हो गया है।

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

@tentimes - "वह क्या है जो इस सूची को संसाधित कर रहा है" $ .Deferred () ऑब्जेक्ट सूची को संसाधित कर रहा है। जब आप कॉल करते हैं .resolve()या .reject()मूल आस्थगित ऑब्जेक्ट पर, कॉलबैक की सूची को कॉल किया जाता है।
user400654

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

3

जावास्क्रिप्ट एकल-थ्रेडेड है, इसलिए आप इसे समझने के लिए थ्रेड के संदर्भ में नहीं सोच सकते। यहाँ jQuery का उपयोग करते हुए नियमित और अतुल्यकालिक कॉलबैक दोनों का एक उदाहरण दिया गया है:

var regularCallback = function(evt) {
    alert("I'm a callback!")
}
var asyncCallback = function(data) {
    alert("I only run when an async operation finishes!")
}

// Bind the regular callback to a button's click event
$('#mybutton').on('click', regularCallback);

// Start an ajax request to the server. The request is asynchronous, so code
// below this line will execute immediately. The callback function
// will only be called when the request is complete.
$.get("http://google.com", asyncCallback);

अब यह मुझे कहीं मिल रहा है, धन्यवाद। तो अतुल्यकालिक एक घटना के जवाब में है जिसे मैंने अजाक्स के साथ सेटअप किया है - जो कि इसे दूर करता है और अगर घटना होती है तो मेरा कॉलबैक कहा जाता है? मुझे लगता है कि मैं इसे प्राप्त कर रहा हूं। क्या नोड.जेएस / jquery jquery usnig आस्थगित वस्तुओं के साथ कुछ ऐसा ही करेगा और उनके साथ बातचीत करने की एक जटिल प्रणाली वास्तव में सिर्फ एक ही काम करती है लेकिन विधियों का उपयोग कर रही है?
तम्बू

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

दोनों अतुल्यकालिक कॉलबैक हैं
रेयोनोस

1

आस्थगित कॉलबैक (उर्फ प्रॉमिस ) आपको बिना दर्द और कॉलबैक स्पेगेटी के अनुक्रमिक एसिंक्रोनस कोड लिखने की अनुमति देता है:

$.when( doAjax(), doAnotherAjax() ).then( haveFunWithMoreAjax ).then( animateStuff );

'जब' आपको समानांतर में लौटने के लिए कार्यों की प्रतीक्षा करता है, और thenक्रमिक रूप से जंजीर हो सकता है।

एक नोट: jQuery deferreds ! = प्रॉमिस / ए , उनका सिंटैक्स थोड़ा अलग है।

विषय पर अच्छे लेख हैं: IEBlog पर एक और कुछ यादृच्छिक ब्लॉग में , एक पुस्तक और एक लोकप्रिय स्टैकओवरफ़्लो प्रश्न


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