दिलचस्प पोस्ट
स्ट्रिंग तुलना – एंड्रॉइड गतिशील आवंटित ऑब्जेक्ट के लिए पॉइंटर्स के वेक्टर में तत्वों को हटाने से पहले मुझे क्या करना चाहिए? मैं एसक्यूएल में एक महीने के पहले दिन कैसे चुन सकता हूं? Git में विशिष्ट संशोधन से एक फाइल कैसे पुनर्प्राप्त करें? जावास्क्रिप्ट दिनांक प्रारूप में MySql दिनांकटाइम स्टैंप कन्वर्ट करें एक तेज चलती छवि स्लाइड शो बनाने के लिए जावास्क्रिप्ट? MySQL में zerofill का क्या लाभ है? आईएसडी एसडीके 3.0 के साथ सीएसवी फ़ाइल में डेटा कैसे निर्यात करें? सूट बनाम चश्मा प्रोट्रेक्टर क्या मुझे जावा प्रतिबिंब के उपयोग से स्थानीय चर के बारे में जानकारी मिल सकती है? SSL प्रमाण पत्र सर्वर के नाम कैसे सुलझाए जाते हैं / क्या मैं कुंजीटोल का उपयोग कर वैकल्पिक नाम जोड़ सकता हूं? Bash में, मैं एक कमांड में फ़ंक्शन कुंजी कैसे बाँधूं? संग्रहीत कार्यविधि और SQLite बनाना है? ReactJS दो घटक संचार जावा: कंसोल साफ़ करें

मैं अतुल्यकालिक XMLHttpRequest के लिए कॉलबैक फ़ंक्शन का लाभ कैसे प्राप्त करूं?

मैं वर्तमान में जावास्क्रिप्ट लिख रहा हूं और कॉलबैक के बारे में भ्रमित कर रहा हूं। मैंने पाया है कि यह किसी प्रकार के निर्मित फ़ंक्शन नहीं है …
मैं अब ओरेली जावास्क्रिप्ट 5 वीं संस्करण पढ़ रहा हूं और यह एक नमूना कोड को नीचे जैसा दिखता है:

getText = function(url, callback) // How can I use this callback? { var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (request.readyState == 4 && request.status == 200) { callback(request.responseText); // Another callback here } } request.open('GET', url); request.send(); } 

असल में, मुझे लगता है कि मैं callback के सामान्य विचार को समझ नहीं पा रहा हूं … क्या किसी को callback लाभ लेने के लिए एक नमूना कोड लिख सकता है?

Solutions Collecting From Web of "मैं अतुल्यकालिक XMLHttpRequest के लिए कॉलबैक फ़ंक्शन का लाभ कैसे प्राप्त करूं?"

कॉलबैक बहुत आसान और निफ्टी हैं! एजेएक्स कॉल की प्रकृति के कारण, जब तक आपका अनुरोध खत्म नहीं हो जाता तब तक आप अपनी स्क्रिप्ट के निष्पादन को ब्लॉक नहीं करते (यह तब तुल्यकालिक होता है)। एक कॉलबैक केवल एक विधि है जिसे आपके द्वारा अपने तरीके से वापस आने के बाद प्रतिक्रिया को संभालने के लिए निर्दिष्ट किया गया है।

चूंकि जावास्क्रिप्ट विधियां प्रथम श्रेणी ऑब्जेक्ट हैं, इसलिए आप उन्हें चरों के समान पास कर सकते हैं।

तो आपके उदाहरण में

 getText = function(url, callback) // How can I use this callback? { var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (request.readyState == 4 && request.status == 200) { callback(request.responseText); // Another callback here } }; request.open('GET', url); request.send(); } function mycallback(data) { alert(data); } getText('somephpfile.php', mycallback); //passing mycallback as a method 

यदि आप उपर्युक्त करते हैं, तो इसका मतलब है कि आप mycallback को एक ऐसी विधि के रूप में पास mycallback जो आपकी प्रतिक्रिया (कॉलबैक) संभालता है।

संपादित करें

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

आपको ध्यान रखना होगा कि यहां महत्वपूर्ण बात यह है कि जेएस विधियां प्रथम श्रेणी के ऑब्जेक्ट हैं। इसका मतलब यह है कि आप उन्हें ऑब्जेक्ट की तरह पास कर सकते हैं और उन्हें सभी प्रकार की घटनाओं के साथ संलग्न कर सकते हैं। जब घटनाओं को ट्रिगर किया जाता है, तो उन घटनाओं से जुड़ी विधियों को बुलाया जाता है।

जब आप request.onreadystatechange = function(){} करते request.onreadystatechange = function(){} आप उचित तरीके से आग लगने पर उस विधि को कह सकते हैं।

इसलिए यहां अच्छी बात यह है कि इन विधियों का पुन: उपयोग किया जा सकता है। कहें कि आपके पास कोई त्रुटि हैंडलिंग विधि है जो एक चेतावनी पॉप अप करती है और AJAX अनुरोध में 404 के मामले में HTML पृष्ठ में कुछ फ़ील्ड पॉपुल करता है।

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


सबसे पहले मैं एक कॉलबैक क्या है पर पढ़ने का सुझाव देगा। यहाँ एक शुरुआत है

बड़ी तस्वीर

कॉलबैक का इस्तेमाल एसिंक्रोनस प्रोग्रामिंग में बड़े पैमाने पर किया जाता है। जब तक आप (संभवतया) लंबे समय से चलने वाले ऑपरेशन के पूरा होने तक ब्लॉक नहीं करना चाहते हैं, तो इस समस्या से निपटने के तरीकों में से एक को ऑपरेशन को किसी ऐसे व्यक्ति को सौंपना है जो आपके लिए पक्ष में करेंगे। यह सवाल उठाता है: ऑपरेशन पूरा होने पर आप यह कैसे बता पाएंगे कि आप इसके परिणाम कैसे प्राप्त करेंगे?

एक समाधान काम किसी और को सौंपना होगा और अपने सामान्य काम से कुछ समय लगेगा और पूछने के लिए "क्या मैंने तुम्हें अभी तक काम दिया है?" यदि हां, तो किसी तरह से परिणाम निकालें और आप के पास जाएं समस्या सुलझ गयी।

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

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

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

इस विशिष्ट मामले में, callback एक ऐसा कार्य है जिसे आप getText को इसे आपके साथ संवाद करने की अनुमति देने के तरीके के रूप में प्रदान करते हैं। आप वास्तव में कह रहे हैं "मेरे लिए यह काम करें, और जब आप समाप्त हो जाएंगे, तो मुझे बताए जाने के लिए कॉल करने के लिए यहां एक फ़ंक्शन है"

getText वास्तव में केवल इस कॉलबैक का उपयोग करने के लिए चुनता है जब XMLHttpRequest (XHR) पूरा हो जाता है, और साथ ही "यह आपको बता देता है" यह आपको HTTP प्रतिक्रिया की सामग्री को भी पास करता है (ताकि आप उस जानकारी पर कार्य कर सकें)।

कॉलबैक और अधिक कॉलबैक, हे मेरी!

लेकिन कोड पढ़ने के लिए एक और पल लें। यह क्या request.onreadystatechange करने के लिए भंडारित मूल्य है। request.onreadystatechange का क्या उद्देश्य है।

इसका जवाब यह है कि request.onreadystatechange है कि आप एक कॉलबैक के साथ पॉप्युलेट कर सकते हैं। असल में, XHR आपको इसे कॉलबैक प्रदान करने का एक तरीका देता है, और जब भी अंतर्निहित HTTP अनुरोधों की स्थिति बदलती है तो "आपको वापस कॉल" करने का वादा करता है

getText एक ऐसा कार्य है जो इसके ऊपर एक अमूर्त बना देता है : यह अपनी कॉलबैक प्लग करता है (एक अनाम समारोह – मैं इसे "आंतरिक" के रूप में संदर्भित करता हूँ) और आप से एक अन्य कॉलबैक स्वीकार करता है (पैरामीटर – I ' ll इसे "बाह्य" के रूप में देखें) जब भीतरी कॉलबैक (जो, याद रखता है: जब भी राज्य में परिवर्तन होता है) इसे पता चलता है कि राज्य "पूर्ण" (मान 4 का अर्थ है) और HTTP प्रतिक्रिया स्थिति कोड 200 (जिसका अर्थ है "ठीक है"), यह कॉल करता है बाहरी कॉलबैक, आपको मिल जाने के लिए, getText के उपयोगकर्ता, परिणाम का पता करें

मुझे आशा है कि मैं समझ रहा हूँ 🙂

उचित "कॉलबैक" फैशन में क्या काम करता है, यह ऐसी सेवा को परिभाषित करना है जो इस तरह से वादा करता है!

 $http.head("url2check").then(function () { return true; }, function () { return false; }); 

नियंत्रक में सेवा का उपयोग करें:

 <service>.<service method>.then(function (found)) { if (found) {...... } 

@जॉन को अतुल्यकालिक फोन करने के लिए सही है!

मुझे व्यक्तिगत रूप से मैं कॉलबैक पर ईवेंट श्रोता का उपयोग करना पसंद करता हूं।

श्रोताओं का उपयोग करना आसान होता है खासकर तब जब आप एकाधिक अतुल्यकालिक अनुरोधों को एक बार में संसाधित करने के लिए तैयार हों।

इसका उपयोग इस प्रकार है ( https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest से लिया गया)

 function reqListener () { console.log(this.responseText); } var oReq = new XMLHttpRequest(); oReq.addEventListener("load", reqListener); oReq.open("GET", "http://www.example.org/example.txt"); oReq.send()