2013-11-02 12 views
79

क्या कोई मुझे नोडजे कॉलबैक का एक साधारण उदाहरण दे सकता है, मैंने पहले से ही कई वेबसाइटों पर इसकी खोज की है लेकिन इसे ठीक से समझने में सक्षम नहीं है, कृपया मुझे एक साधारण उदाहरण दें।नोडजेएस कॉलबैक सरल उदाहरण

getDbFiles(store, function(files){ 
    getCdnFiles(store, function(files){ 
    }) 
}) 

मैं ऐसा ही कुछ करना चाहता हूँ ...

+0

कैसे एक समारोह है कि एक तर्क के रूप एक कॉलबैक लेता लिखने के लिए एक उदाहरण के रूप में एक सरल समारोह बना रहे हैं? – Gntem

+0

हाँ ऐसा कुछ, कोई साधारण उदाहरण जो मुझे समझने में मदद करता है। –

+0

एक कॉलबैक एक ऐसा फ़ंक्शन है जिसे आप किसी अन्य फ़ंक्शन पर पैरामीटर के रूप में पास करते हैं ... Google pls -> "कॉलबैक जावास्क्रिप्ट" -> पहला परिणाम –

उत्तर

151
var myCallback = function(data) { 
    console.log('got data: '+data); 
}; 

var usingItNow = function(callback) { 
    callback('get it?'); 
}; 

अब खुला नोड या ब्राउज़र कंसोल और उपरोक्त परिभाषाओं पेस्ट करें।

अंत में इस अगली पंक्ति के साथ उपयोग करें:

usingItNow(myCallback); 

नोड-शैली त्रुटि कन्वेंशनों

कोस्टा पूछा यह है कि अगर हम नोड त्रुटि कॉलबैक सम्मानित करने के लिए थे दिखाई देंगे करने के लिए सम्मान के साथ सम्मेलनों।

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

यहां मैं इस सम्मेलन में हमारे उदाहरण को फिर से लिखता हूं।

var myCallback = function(err, data) { 
    if (err) throw err; // Check for the error and throw if it exists. 
    console.log('got data: '+data); // Otherwise proceed as usual. 
}; 

var usingItNow = function(callback) { 
    callback(null, 'get it?'); // I dont want to throw an error, so I pass null for the error argument 
}; 

हम एक त्रुटि मामले अनुकरण करने के लिए चाहते हैं, हम usingItNow इस

var usingItNow = function(callback) { 
    var myError = new Error('My custom error!'); 
    callback(myError, 'get it?'); // I send my error as the first argument. 
}; 

की तरह है बिल्कुल वैसा ही ऊपर के रूप में परिभाषित कर सकते हैं अंतिम उपयोग:

usingItNow(myCallback); 

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

+0

तो यह पहली पैरामीटर सम्मेलन के रूप में त्रुटि के साथ कैसा दिखता है? – Costa

+2

ग्रेट एवर! बधाई! – lesimoes

+0

बहुत बढ़िया जवाब !! +1 –

9

यहाँ fs.readFile और fs.writeFile साथ नकल पाठ फ़ाइल का एक उदाहरण है:

var fs = require('fs'); 

var copyFile = function(source, destination, next) { 
    // we should read source file first 
    fs.readFile(source, function(err, data) { 
    if (err) return next(err); // error occurred 
    // now we can write data to destination file 
    fs.writeFile(destination, data, next); 
    }); 
}; 

और वह copyFile समारोह का उपयोग करने का एक उदाहरण है: कि पहला तर्क चलता है

copyFile('foo.txt', 'bar.txt', function(err) { 
    if (err) { 
    // either fs.readFile or fs.writeFile returned an error 
    console.log(err.stack || err); 
    } else { 
    console.log('Success!'); 
    } 
}); 

आम पैटर्न Node.js कॉलबैक फ़ंक्शन का एक त्रुटि है।

next(new Error('I cannot do it!')); // error 

next(null, results); // no error occurred, return result 
+1

अगला क्या है? वेरिएबल परिणाम क्या हैं = क्या कहा जा रहा है? –

+3

@ सेमिकोलनवायर मेरे लिए एक पॉइंटर और साथ ही अन्य: http://stackoverflow.com/questions/5384526/javascript-node-js-next – kmonsoor

87

एक कॉलबैक फ़ंक्शन बस एक समारोह यदि आप किसी अन्य समारोह में पारित इतना है कि समारोह बाद में यह कॉल कर सकते हैं यह है: क्योंकि सभी नियंत्रण प्रवाह मॉड्यूल इस पर निर्भर आप इस पद्धति का उपयोग करना चाहिए। यह आमतौर पर एसिंक्रोनस API एस में देखा जाता है; एपीआई कॉल तुरंत लौटाता है क्योंकि यह असीमित है, इसलिए आप इसमें एक फ़ंक्शन पास करते हैं कि API एसिंक्रोनस कार्य करने के दौरान कॉल कर सकता है।

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

setTimeout(function() { 
    console.log("10 seconds later..."); 
}, 10000); 

आपने उपर्युक्त कोड पहले देखा होगा लेकिन आपको पता नहीं था कि आप जिस समारोह में गुजर रहे थे उसे कॉलबैक फ़ंक्शन कहा जाता था। हम इसे अधिक स्पष्ट बनाने के लिए ऊपर दिए गए कोड को फिर से लिख सकते हैं। क्योंकि नोड जमीन से बनाया गया है ऊपर सब कुछ है कि यह करता है में अतुल्यकालिक होने की

var callback = function() { 
    console.log("10 seconds later..."); 
}; 
setTimeout(callback, 10000); 

कॉलबैक नोड में हर जगह उपयोग किया जाता है। फाइल सिस्टम से बात करते समय भी। यही कारण है कि आंतरिक नोड एपीआई का एक टन कॉलबैक फ़ंक्शंस को उस डेटा को वापस करने के बजाय तर्क के रूप में स्वीकार करता है जिसे आप एक चर को असाइन कर सकते हैं। इसके बजाय यह आपके कॉलबैक फ़ंक्शन को आपके द्वारा तर्क के रूप में इच्छित डेटा को पारित करेगा। उदाहरण के लिए, आप फ़ाइल पढ़ने के लिए नोड की fs लाइब्रेरी का उपयोग कर सकते हैं। fs मॉड्यूल दो अद्वितीय API फ़ंक्शंस का खुलासा करता है: readFile और readFileSync

readFile फ़ंक्शन असीमित है जबकि readFileSync स्पष्ट रूप से नहीं है। आप देख सकते हैं कि वे जब भी संभव हो तो एसिंक कॉल का उपयोग करने का इरादा रखते हैं क्योंकि उन्हें readFile और readFileSyncreadFile और readFileAsync के बजाय कहा जाता है। यहां दोनों कार्यों का उपयोग करने का एक उदाहरण दिया गया है।

तुल्यकालिक:

var data = fs.readFileSync('test.txt'); 
console.log(data); 

कोड ऊपर ब्लॉक धागा निष्पादन जब तक सभी test.txt की सामग्री को स्मृति में पढ़ सकते हैं और चर data में संग्रहीत हैं। नोड में यह आमतौर पर खराब अभ्यास माना जाता है। ऐसे समय होते हैं जब यह उपयोगी होता है, जैसे कि कुछ सरल लेकिन कठिन काम करने के लिए त्वरित छोटी लिपि लिखते समय और आप जितना समय कर सकते हैं, हर नैनोसेकंद को बचाने के बारे में ज्यादा परवाह नहीं करते हैं।

(कॉलबैक के साथ) अतुल्यकालिक:

var callback = function (err, data) { 
    if (err) return console.error(err); 
    console.log(data); 
}; 
fs.readFile('test.txt', callback); 

पहले हम एक कॉलबैक समारोह है कि दो तर्क err और data को स्वीकार करता। एसिंक्रोनस फ़ंक्शंस के साथ एक समस्या यह है कि त्रुटियों को जाल करना अधिक कठिन हो जाता है, इसलिए बहुत से कॉलबैक-शैली एपीआई कॉलबैक फ़ंक्शन के पहले तर्क के रूप में त्रुटियों को पार करते हैं। यह जांचने का सबसे अच्छा अभ्यास है कि err आपके पास कुछ और करने से पहले एक मूल्य है। यदि ऐसा है, तो कॉलबैक के निष्पादन को रोकें और त्रुटि लॉग करें।

सिंक्रोनस कॉल का लाभ तब होता है जब अपवाद फेंकते हैं क्योंकि आप उन्हें try/catch ब्लॉक से पकड़ सकते हैं।

try { 
    var data = fs.readFileSync('test.txt'); 
    console.log(data); 
} catch (err) { 
    console.error(err); 
} 

असीमित कार्यों में यह इस तरह से काम नहीं करता है। एपीआई कॉल तुरंत लौटाता है इसलिए try/catch के साथ पकड़ने के लिए कुछ भी नहीं है। कॉलबैक का उपयोग करने वाले उचित एसिंक्रोनस एपीआई हमेशा अपनी त्रुटियों को पकड़ लेंगे और फिर उन त्रुटियों को कॉलबैक में पास करेंगे जहां आप फिट बैठकर इसे संभाल सकते हैं।

कॉलबैक के अलावा, एपीआई की एक और लोकप्रिय शैली है जिसे आम तौर पर वादा कहा जाता है। यदि आप उनके बारे में पढ़ना चाहते हैं तो आप इस उत्तर here पर आधारित पूरे ब्लॉग पोस्ट को पढ़ सकते हैं।

+0

अवधारणा का एक विस्तृत अभी तक संक्षिप्त वितरण; मेरे जैसे node.js स्टार्टर के लिए ... – kmonsoor

2

इस उदाहरण को जितना सरल हो सके उतना आसान आज़माएं, बस एप्लिकेशन को चलाने के लिए newfile.js नोड न्यूफाइल को कॉपी करें।

function myNew(next){ 
    console.log("Im the one who initates callback"); 
    next("nope", "success"); 
} 


myNew(function(err, res){ 
    console.log("I got back from callback",err, res); 
}); 
1

हम

callBackFunction (data, function (err, response){ 
    console.log(response) 
}) 

// callbackfunction 
function callBackFuntion (data, callback){ 
    //write your logic and return your result as 
callback("",result) //if not error 
callback(error, "") //if error 
} 
संबंधित मुद्दे