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

क्या कोई कृपया मुझे बता सकता है कि नीचे दिए गए दोनों कार्यान्वयन एक दूसरे से कैसे भिन्न हैं? या एक वास्तविक मामला परिदृश्य जो सामान्य फ़ंक्शन कॉल की तुलना में कॉलबैक को उपयोगी बनाता है?

सामान्य फ़ंक्शन कॉल का उपयोग करना

function getDetails(){
    setTimeout(() => {
        console.log("DETAILS")
    }, 2000);
}

function getUser(){
    setTimeout(() => {
        console.log("USER");
        getDetails(); // Normally calling the function
    }, 3000);
}

getUser();

कॉलबैक का उपयोग करना

function getDetails(){
    setTimeout(() => {
        console.log("DETAILS")
    }, 2000);
}

function getUser(callback){
    setTimeout(() => {
        console.log("USER");
        callback(); // Calling the function
    }, 3000);
}

getUser(getDetails);
2
ima.technophyle 3 अक्टूबर 2021, 19:51
2
एक और अंतर विशिष्ट फ़ंक्शन के लिए बाध्यकारी और परिवर्तनीय बंधन का समय है। उस फॉर्म के मामले में जो "कॉलबैक" को एक पैरामीटर के रूप में स्वीकार करता है, "कॉलबैक" वैरिएबल का मान कभी नहीं बदलेगा (तर्क का मूल्यांकन तब किया जाता है जब getUser कहा जाता है)। हालाँकि, पहले रूप में, "getDetails" को टाइमआउट होने से पहले बदला जा सकता है।
 – 
user2864740
3 अक्टूबर 2021, 19:57
ओह... अब सब कुछ समझ में आता है। धन्यवाद दोस्तों...
 – 
ima.technophyle
3 अक्टूबर 2021, 19:59
2
संपूर्ण विचार यह है कि आप कॉलबैक के रूप में किस फ़ंक्शन का उपयोग करना चुन सकते हैं, उदा। getUser(getDetails) और getUser(getSecondUser) या getUser(writeResult) दोनों का उपयोग करें। आपके पास पहले संस्करण में ये विकल्प नहीं हैं जहां getDetails हार्डकोड किया गया है।
 – 
Bergi
3 अक्टूबर 2021, 20:29

1 उत्तर

सबसे बढ़िया उत्तर

आपके द्वारा दिखाए गए दो उदाहरणों में तकनीकी रूप से कोई अंतर नहीं है (यह मानते हुए कि आप getDetails को कॉल करने से पहले संशोधित नहीं करेंगे)। यह जो उपयोगी बनाता है वह यह है कि कॉलबैक को कॉल करने वाले फ़ंक्शन को कॉल करने के लिए सटीक फ़ंक्शन को जानने की आवश्यकता नहीं है (और आवश्यकतानुसार अलग-अलग लोगों के साथ उपयोग किया जा सकता है)। उदाहरण के लिए, ईवेंट श्रोता या Array.prototype.map पर कॉलबैक जैसा कुछ केवल कॉलबैक पैटर्न के साथ समझ में आता है।

लेकिन आपके द्वारा दिखाया गया परिदृश्य आदर्श रूप से या तो उपयोग नहीं करेगा - इसे async/प्रतीक्षा का उपयोग करने के लिए पुनर्गठित किया जाना चाहिए:

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))

async function getDetails (user) {
  await sleep(2000)
  console.log('DETAILS', user)
  return 'some details'
}

async function getUser (userId) {
  await sleep(3000)
  console.log('USER', userId)
  return 'some user' 
}

async function main () {
  const user = await getUser(123)
  const details = await getDetails(user)
  console.log('got these details:', details)
}

main().catch(e => console.error('Failed to fetch data:', e))
// If you are in an environment that supports top-level await, 
// you can just use `await main()` instead

मैंने वास्तविक उपयोग के मामले को चित्रित करने के लिए कुछ और उदाहरण सामग्री जोड़ी।

2
CherryDT 3 अक्टूबर 2021, 20:01