कॉलबैक का उपयोग करते समय जावास्क्रिप्ट कोड अतुल्यकालिक कैसे हो जाता है?


26

मैं ऑनलाइन पढ़ने की कोशिश कर रहा हूं कि अतुल्यकालिक जावास्क्रिप्ट कोड लिखने की कोशिश करूं। मेरे शोध में बहुत सारी तकनीकों में से एक कॉलबैक का उपयोग करना है। जब मैं कॉलबैक फ़ंक्शन को लिखने और निष्पादित करने की प्रक्रिया को समझता हूं, तो मैं उलझन में हूं कि कॉलबैक स्वचालित रूप से जावास्क्रिप्ट निष्पादन को अतुल्यकालिक क्यों बनाते हैं। तो, मेरा सवाल यह है: मेरे जावास्क्रिप्ट कोड में कॉलबैक फ़ंक्शन को जोड़ने से कोड स्वचालित रूप से async कहा जाता है?


2
आपको यह पढ़ने में दिलचस्पी हो सकती है कि जॉन रेसिग
Jalayn

@Jalayn। धन्यवाद। आपकी टिप्पणी ने कई उत्तरों को पढ़ने के बाद सभी अंतर बनाए।
कुशाल्वम

जवाबों:


26

यह नहीं है बस कॉलबैक लेने या कॉलबैक पास करने का मतलब यह नहीं है कि यह अतुल्यकालिक है।

उदाहरण के लिए, .forEachफ़ंक्शन कॉलबैक लेता है लेकिन समकालिक है।

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

setTimeoutभी एक कॉलबैक लेता है और अतुल्यकालिक है।

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

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


2
@SteveEvers मुझे लगता है कि आप तब MDN लेख को संपादित कर सकते हैं । कॉलबैक किसी अन्य फ़ंक्शन के लिए जावास्क्रिप्ट में एक बहुत ही सामान्य शब्द है जो आपके द्वारा दिए गए फ़ंक्शन का उपयोग करके आपको वापस कॉल करता है ... इसे जटिल क्यों करें? संपादित करें: कॉलबैक का उपयोग ऐनक
एस्लेइजा

3
@SteveEvers "कॉलबैक का अर्थ है एसिंक्रोनसी" एक C # / Microsoft idiosyncrasy है। en.wikipedia.org/wiki/Callback_(computer_programming)
एसाइलीजा

1
@ माइकबर्न मुझे लगता है कि मैंने उसकी प्रोफाइल में बहुत अधिक पढ़ा है और यह - सबसे उत्कीर्ण उत्तर निश्चित रूप से एक विचार देता है कि "कॉलबैक असिंक्रोनस"।
एस्लेइजा

1
लेकिन कहा जा रहा है कि @SteveEvers भी गलत है। कॉलबैक का मतलब अतुल्यकालिक नहीं है, बस "कॉल बैक" के लिए कोई और जिम्मेदार होगा।
माइकल ब्राउन

1
+1 क्योंकि स्टीव एवर गलत है
स्लीबटमैन

23

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

( नोट: यह विषय का एक बहुत ही उच्च-स्तरीय, वैचारिक अवलोकन है जो विवरण में नहीं जाता है, क्योंकि विभिन्न JS इंजन अलग-अलग तरीकों से चीजों को लागू करने जा रहे हैं। लेकिन यह सामान्य विचार है कि यह कैसे काम करता है।)


ये कौन सी घटनाएँ हैं? एक या दो ऐसे आयोजनों का उदाहरण आपके उत्तर को और बेहतर बना देगा।
जो स्मो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.