নোড.জেএস-এ উপভোগ করুন, ইভেন্টগুলির উপরে কলব্যাকগুলি ব্যবহার করে কী কী লাভ হয়েছে?


24

আমি একজন শিক্ষানবিস জাভাস্ক্রিপ্টার এবং ভি 8 ইঞ্জিনের ভিতরে কী চলে তার কোনও সত্যিকারের জ্ঞান নেই।

এই কথাটি বলে, আমি নোড.জেএস পরিবেশে আমার প্রথম দিকের প্রচারণা উপভোগ করছি কিন্তু আমি দেখতে পেয়েছি যে আমি ক্রমাগত ইভেন্টগুলি ব্যবহার করে যাচ্ছি। আমি যা লিখতে চাই তার অনুরূপ প্যাটার্নটি একটি উদ্দেশ্য-সি বা পাইথন প্রোগ্রাম বলে।

আমি নিজেকে সর্বদা এই জাতীয় জিনিসগুলি দেখতে পাই:

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 ব্যবহার করেন, তাহলে আপনি ব্যবহার করতে পারে বিলম্বিত । সবচেয়ে সহজ প্রতিশ্রুতি ফ্রেমওয়ার্কগুলির মধ্যে একটি হ'ল আরএসভিপি
ব্রায়ান

আমি বিভ্রান্ত হয়ে পড়েছি, আমি আপনার কোডে অ্যাসিঙ্ক কিছুই দেখছি না, কেবলমাত্র একটি জটিল উপায়ে লিখিত ফাংশন কল।
সুইভ

উত্তর:


27

কলব্যাকস সম্পর্কে দুর্দান্ত বিষয় হ'ল এখানে কোনও বিশ্বব্যাপী অবস্থা নেই এবং তাদের কাছে পরামিতিগুলি ত্যাগ করা তুচ্ছ। আপনার যদি কোনও ফাংশন থাকে download(URL, callback: (FileData)->void)তবে আপনি জানতে পারবেন যে এটি একটি স্ব-অন্তর্ভুক্ত উচ্চ-অর্ডার ফাংশন যা মূলত আপনাকে একটি "এটি ধরুন এবং এটি করুন" ফাংশনটি তৈরি করতে দেয়। আপনি নিশ্চিত হতে পারেন যে আপনার কোড প্রবাহটি আপনি যেমন প্রত্যাশা করেছিলেন ঠিক তেমনই কারন কারও কারও কাছে এই কলব্যাকের একটি হ্যান্ডেল নেই এবং সেই কলব্যাকটি প্যারেন্ট ফাংশনের প্রদত্ত পরামিতিগুলি ছাড়া কিছুই জানতে পারে না। এটি এটিকে মডুলার এবং পরীক্ষা করা সহজ করে তোলে।

আপনি যদি এখন সমান্তরালভাবে 5 টি ফাইল ডাউনলোড করতে চান এবং বিভিন্ন জিনিস করতে চান, তবে উপযুক্ত কলব্যাক ফাংশনগুলির সাথে আপনার কেবল পাঁচটি ফাংশন বন্ধ করতে হবে। ভাল বেনাম ফাংশন সিনট্যাক্স সহ একটি ভাষায় এটি অবিশ্বাস্যভাবে শক্তিশালী হতে পারে।

অন্যদিকে ইভেন্টগুলি আরও 1..*কিছু রাষ্ট্রীয় পরিবর্তনের বিষয়ে ব্যবহারকারীদের জানানোর জন্য আরও বেশি নকশাকৃত । আপনি যদি শেষে "ডাউনলোড সম্পূর্ণ" ইভেন্টটি চালিয়ে যান download(URL), যা processDownload()ডেটা কোথায় সন্ধান করতে পারে তা সূচনা করে, আপনি আপনার বাস্তবায়নের জিনিসগুলি বৃহত পরিমাণে বেঁধে রাখছেন। আপনি এখন ডাউনলোডগুলি কীভাবে সমান্তরাল করবেন? আপনি কীভাবে আলাদা আলাদা ডাউনলোডগুলি হ্যান্ডেল করবেন? কি download(URL, eventId)মার্জিত? কি downloadAndDoThing(URL)মার্জিত? কষ্টসহকারে।

অবশ্যই, সমস্ত কিছুর মতোই, আপনি ট্রেড অফ করছেন। নেস্টেড কলব্যাকস কোডকে কার্যকর করার আদেশটিকে আরও বিভ্রান্তিকর করে তুলতে পারে এবং সহজে বিশ্বব্যাপী অ্যাক্সেসযোগ্যতার অভাব যেখানেই আপনার নির্মাতা এবং ভোক্তার মধ্যে সম্পর্ক রাখে এমন কোনও জিনিসের জন্য এটি একটি দুর্বল পছন্দ করে তোলে 1..*। আপনার চারপাশের ডেটা পাস করাতে আরও শক্ত সময় রয়েছে তবে আপনি যদি অতিরিক্ত রাজ্য না পেয়ে পালাতে পারেন তবে যাইহোক এটি সাধারণত একটি উপকার।

হোক না কেন। আপনি নোড.জেএসগুলিতে কোডিং করছেন যেখানে কলব্যাকগুলি মূর্তিযুক্ত এবং ভাষা এবং গ্রন্থাগারগুলি তাদের ব্যবহারের চারপাশে নকশা করা হয়েছে। আপনি কোনও ডিজাইনের বা অন্য কোনও সুবিধাগুলি দেখতে পান না কেন, আমি মনে করি এটি প্রায় সর্বদা সত্য যে কোনও ভাষায় আইডেম্যাটিক কোড লেখার পক্ষে আরও বেশি সমর্থন পাওয়া যায় এবং এটিকে অবরুদ্ধ করার চেষ্টা করার চেয়ে আপনার জীবনকে আরও সহজ করে তুলবে।


2

আমি নোডজেএসে কখনও ইভেন্টগুলি ব্যবহার করি নি, তবে সাধারণত আমি ক্লায়েন্টাইড জেএস ইভেন্টগুলির জন্য যা ব্যবহার করি তা সংকেত দেয় যে কিছু ঘটেছিল, যেমন একটি অ্যাপয়েন্টমেন্ট অ্যাপয়েন্টমেন্ট বুকডেন্ট, যাতে কোনও এসপিএ ভিউয়ের বিভিন্ন অংশ প্রতিক্রিয়া জানাতে পারে (এটি একটি টাইমলাইনে দেখান, এটি লোড করুন) একটি প্যানেলে, ইত্যাদি)।
তবে কোনও পদ্ধতি সম্পূর্ণ হয়ে যাওয়ার ইঙ্গিত দিতে ইভেন্টগুলি ব্যবহার করা ভ্রমণের পক্ষে বিপজ্জনক রাস্তা হতে পারে। ইভেন্টগুলি যেভাবে বরখাস্ত করা হয়েছিল সেভাবে পৌঁছানোর জন্য আপনি নির্ভর করতে পারবেন না, যাতে এটি সমস্ত ধরণের এলোমেলো হতে পারে ...
ইভেন্টগুলি ব্যবহারে কোনও ভুল নেই, তবে গ্র্যানুলারিয়ালের একটি নির্দিষ্ট স্তর রয়েছে যা আপনার অধীনে যাওয়া উচিত নয় ; যদি আপনি ডোমেন-ইশ ইভেন্টগুলিতে লেগে থাকেন তবে তা ঠিক। তবে পদ্ধতিগুলি শেষ হয়ে গেছে তা অবহিত করা খুব দানাদার।


0

আপনি যে কোনও কিছু অন্বেষণ করতে পারবেন তা হ'ল অবজেক্টের বাইরের ইভেন্টগুলির ব্যবহার which আপনার উদাহরণে, eventCenterএর নিজস্ব ইভেন্টগুলি নির্গত করে এবং পরিচালনা করে উভয়কেই প্রদর্শিত হয়। অন্যান্য বিষয়গুলি ইভেন্টগুলি পরিচালনা করতে শুরু করলে আপনার অ্যাপ্লিকেশনটির কাঠামো কীভাবে পরিবর্তিত হতে পারে তা বিবেচনা করুন।

সুতরাং, eventCenter"init" নির্গত হতে পারে, যা অন্য বস্তুগুলি তাদের প্রারম্ভিক কোড ইত্যাদি করতে পারে etc.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.