नोड्स के लिए नौसिखिया। घटनाओं पर कॉलबैक का उपयोग करके क्या फायदा हुआ है?


24

मैं एक नौसिखिया JavaScripter हूं और मुझे V8 इंजन के अंदर जाने के बारे में कोई वास्तविक ज्ञान नहीं है।

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

मैं खुद को हमेशा इस तरह की चीजें करते हुए पाता हूं:

var events = require('events');

var eventCenter = new events.EventEmitter();

eventCenter.on('init', function() {
    var greeting = 'Hello World!';
    console.log('We're in the init function!);
    eventCenter.emit('secondFunction', greeting);
});

eventCenter.on('secondFunction', function(greeting) {
        console.log('We're in the second function!);
        console.log(greeting);
    eventCenter.emit('nextFunction');
});

eventCenter.on('nextFunction', function {
    /* do stuff */
});

eventCenter.emit('init');

इसलिए वास्तव में मैं 'async' नोड को संरचित कर रहा हूं। नोड कोड में कोड है जो मुझे उम्मीद है कि आदेश में चीजें करता है, इसके बजाय मैं "कोडिंग बैकवर्ड" कर रहा हूं अगर यह समझ में आता है। क्या यह कॉलबैक-भारी तरीके से करने में कोई अंतर होगा, प्रदर्शन-वार या दर्शन-वार? क्या घटनाओं के बजाय कॉलबैक का उपयोग करना बेहतर है?


यदि आप कॉलबैक के भारी उपयोग के कारण अपने कोड की पठनीयता को पीड़ित पाते हैं, तो कॉलबैक के अपने उपयोग को लपेटने के लिए एक फ्रेमवर्क के उपयोग पर विचार करें। इसमें थोड़ा सा समायोजन होता है, लेकिन वादे अक्सर बदसूरत कॉलबैक को अनसुना कर सकते हैं। यदि आप JQuery का उपयोग कर रहे हैं, तो आप आस्थगित का उपयोग कर सकते हैं । सबसे सरल वादा ढांचे में से एक RSVP है
ब्रायन

मैं उलझन में हूं, मुझे आपके कोड में कुछ भी एस्किंक नहीं दिख रहा है, बस ओवरकम्प्लिकेटेड तरीके से लिखे गए कॉल कॉल हैं।
svick

जवाबों:


27

कॉलबैक के बारे में अच्छी बात यह है कि वहां कोई वैश्विक स्थिति नहीं है, और उनके लिए पैरामीटर पारित करना तुच्छ है। यदि आपके पास कोई फ़ंक्शन है, download(URL, callback: (FileData)->void)तो आप जान सकते हैं कि एक स्व-निहित उच्च-क्रम फ़ंक्शन है जो अनिवार्य रूप से आपको "इसे पकड़ो और उस कार्य" को बनाने देता है। आप यह सुनिश्चित कर सकते हैं कि आपका कोड फ्लो ठीक उसी तरह है जैसा आप उम्मीद करते हैं, क्योंकि उस कॉलबैक पर किसी और के पास भी कोई हैंडल नहीं है, और यह कॉलबैक कुछ भी नहीं जानता है, लेकिन मूल फ़ंक्शन के दिए गए पैरामीटर। यह इसे मॉड्यूलर और परीक्षण करने में आसान बनाता है।

यदि आप अब समानांतर में 5 फ़ाइलों को डाउनलोड करना चाहते हैं और अलग-अलग काम करना चाहते हैं, तो आपको उपयुक्त कॉलबैक फ़ंक्शन के साथ इनमें से केवल पांच फ़ंक्शन को बंद करना होगा। अच्छे अनाम फ़ंक्शन सिंटैक्स वाली भाषा में यह अविश्वसनीय रूप से शक्तिशाली हो सकता है।

दूसरी ओर, ईवेंट 1..*कुछ राज्य परिवर्तन के उपयोगकर्ताओं को सूचित करने के लिए अधिक डिज़ाइन किए गए हैं। यदि आप एक "पूर्ण डाउनलोड" ईवेंट को आग download(URL)लगाते हैं, जो लॉन्च करता है processDownload()जो जानता है कि डेटा कहां खोजना है, तो आप चीजों के अपने कार्यान्वयन को बड़ी मात्रा में बांध रहे हैं। अब आप समानांतर कैसे डाउनलोड करते हैं? आप अलग-अलग डाउनलोड को अलग तरह से कैसे हैंडल करते हैं? है download(URL, eventId)सुरुचिपूर्ण? है downloadAndDoThing(URL)सुरुचिपूर्ण? मुश्किल से।

बेशक, सभी चीजों के साथ, आप व्यापार कर रहे हैं। नेस्टेड कॉलबैक कोड के निष्पादन अधिक भ्रमित के आदेश कर सकते हैं, और आसान वैश्विक पहुंच-योग्यता की कमी यह कुछ भी है जहाँ आप के लिए एक गरीब विकल्प बनाता है कर एक है 1..*उत्पादक और उपभोक्ता के बीच संबंध। आपके पास डेटा पास करने में कठिन समय है, लेकिन यदि आप अतिरिक्त स्थिति नहीं होने के साथ दूर हो सकते हैं, तो यह आमतौर पर वैसे भी एक लाभ है।

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


2

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


0

आपके द्वारा खोजा जा रहा कुछ वस्तु के बाहर की घटनाओं का उपयोग है जो उन्हें उत्सर्जित कर रहा है। आपके उदाहरण में, eventCenterदोनों अपने स्वयं के ईवेंट का उत्सर्जन और प्रबंधन करने के लिए प्रकट होते हैं। विचार करें कि यदि अन्य ऑब्जेक्ट घटनाओं को संभालना शुरू करते हैं तो आपके एप्लिकेशन की संरचना कैसे बदल सकती है।

तो, eventCenter"इनिट" का उत्सर्जन हो सकता है, जो अन्य वस्तुएं तब अपने स्टार्टअप कोड को करने के लिए संभाल सकती हैं, आदि।

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