নোড.জেএস কলব্যাক পিরামিডের সাথে লেনদেন করা


9

আমি সবেমাত্র নোড ব্যবহার শুরু করেছি এবং একটি জিনিস যা আমি দ্রুত লক্ষ্য করেছি তা হ'ল কলব্যাকগুলি কত তাড়াতাড়ি ইন্ডেন্টেশনের নির্বোধ স্তর তৈরি করতে পারে:

doStuff(arg1, arg2, function(err, result) {
    doMoreStuff(arg3, arg4, function(err, result) {
        doEvenMoreStuff(arg5, arg6, function(err, result) {
            omgHowDidIGetHere();
        });
    });
});

সরকারী শৈলী গাইড একটি পৃথক ফাংশন প্রতিটি কলব্যাক করা বলছেন, কিন্তু যে মাত্রাতিরিক্ত বন্ধ ব্যবহারের উপর নিয়ন্ত্রণমূলক বলে মনে হয় এবং তৈরীর একটি একক বস্তুর শীর্ষ স্তরের ঘোষণা প্রাপ্তিসাধ্য বেশ কয়েক স্তর নিচে, যেমন বস্তুর সব মাধ্যমে গৃহীত হবে মধ্যবর্তী কলব্যাক

এখানে সহায়তা করার জন্য ফাংশন স্কোপ ব্যবহার করা কি ঠিক হবে? এমন সমস্ত কলব্যাক ফাংশন রাখুন যা গ্লোবাল-ইশ অবজেক্টে অ্যাক্সেসের প্রয়োজন এমন কোনও ফাংশনের ভিতরে রাখুন যা সেই অবজেক্টটিকে ঘোষণা করে, তাই এটি বন্ধ হয়ে যায়?

function topLevelFunction(globalishObject, callback) {

    function doMoreStuffImpl(err, result) {
        doMoreStuff(arg5, arg6, function(err, result) {
            callback(null, globalishObject);
        });
    }

    doStuff(arg1, arg2, doMoreStuffImpl);
}

এবং আরও অনেক স্তর জন্য ...

অথবা প্রতিটি একক কলব্যাকের জন্য নামকরণের ফাংশন ঘোষণা না করে ইন্ডেন্টেশনের মাত্রা হ্রাস করতে ফ্রেমওয়ার্কস ইত্যাদি রয়েছে? আপনি কলব্যাক পিরামিডকে কীভাবে মোকাবেলা করবেন?


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

উত্তর:


7

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

"প্রতিশ্রুতি" এর একাধিক বাস্তবায়ন রয়েছে:


উদাহরণস্বরূপ আপনি এই নেস্টেড কলব্যাকগুলি আবার লিখতে পারেন

http.get(url.parse("http://test.com/"), function(res) {
    console.log(res.statusCode);
    http.get(url.parse(res.headers["location"]), function(res) {
        console.log(res.statusCode);
    });
});

মত

httpGet(url.parse("http://test.com/")).then(function (res) {
    console.log(res.statusCode);
    return httpGet(url.parse(res.headers["location"]));
}).then(function (res) {
    console.log(res.statusCode);
});

কলব্যাকের কলব্যাকের পরিবর্তে a(b(c()))আপনি ".থেন" চেইন করুন a().then(b()).then(c())


এখানে একটি ভূমিকা: http://howtonode.org/ প্রম্পাইস


এই সংস্থানগুলি কী করে সে সম্পর্কে আরও ব্যাখ্যা করতে আপনি কি আপত্তি করবেন এবং কেন আপনি জিজ্ঞাসিত প্রশ্নের উত্তর হিসাবে এগুলি সুপারিশ করবেন? "লিঙ্ক কেবল-উত্তর" বেশ স্ট্যাক এক্সচেঞ্জ এ স্বাগত জানাই হয় না
মশা

1
আচ্ছা দুঃখিত. আমি একটি উদাহরণ এবং আরও তথ্য যুক্ত করেছি।
ফ্যাবিয়ান সা

3

প্রতিশ্রুতিগুলির বিকল্প হিসাবে আপনার জেনারেটর ফাংশনগুলিরyield সাথে মিলিয়ে কীওয়ার্ডটি একবার দেখুন যা ইকামাস্ক্রিপ্ট in এ প্রবর্তিত হবে will উভয়ই আজ নোড.জেস 0.11.x বিল্ডে উপলব্ধ, তবে নোড চালানোর সময় আপনি অতিরিক্তটি পতাকা নির্দিষ্ট করার প্রয়োজন .js:--harmony

$ node --harmony app.js

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

মূলত, আপনাকে যা করতে হবে তা হল কোডের জন্য একটি জেনারেটর ফাংশন লিখুন যা অ্যাসিঙ্ক্রোনাস স্টাফ চালায়, সেখানে অ্যাসিঙ্ক স্টাফটি কল করুন, তবে yieldকীওয়ার্ড সহ এটি উপস্থাপন করুন । সুতরাং, শেষ পর্যন্ত আপনার কোডটি দেখে মনে হচ্ছে:

var run = function * () {
  var data = yield doSomethingAsync();
  console.log(data);
};

এই জেনারেটরের ক্রিয়াকলাপটি চালানোর জন্য আপনার পূর্বে উল্লিখিত কোয়ের মতো একটি লাইব্রেরি প্রয়োজন। কলটি এর পরে মনে হচ্ছে:

co(run);

বা, এটি ইনলাইন রাখতে:

co(function * () {
  // ...
});

দয়া করে নোট করুন যে জেনারেটর ফাংশন থেকে আপনি অন্যান্য জেনারেটর ফাংশনগুলি কল করতে পারেন, আপনাকে যা করতে হবে তা হ'ল এটিকে yieldআবার প্রিফিক্স করে ।

এই বিষয়টির পরিচিতির জন্য, গুগল যেমন শর্তাবলী অনুসন্ধান করুন yield generators es6 async nodejsএবং আপনার প্রচুর তথ্য পাওয়া উচিত should এটিতে অভ্যস্ত হতে কিছুক্ষণ সময় লাগে তবে একবার আপনি এটি পেয়ে গেলে আপনি আর ফিরে যেতে চান না।

দয়া করে মনে রাখবেন যে এটি আপনাকে ফাংশনগুলিতে কল করার জন্য একটি ভাল সিনট্যাক্স সরবরাহ করে না, এটি আপনাকে forলুপ বা try/ এর মতো সাধারণ (সিঙ্ক্রোনাস) নিয়ন্ত্রণ প্রবাহের যুক্তিযুক্ত জিনিসগুলিও ব্যবহার করতে দেয় catch। প্রচুর কলব্যাক এবং এই সমস্ত জিনিস নিয়ে আর গোলযোগ নেই।

গুড লাক এবং মজা আছে :-)!


0

আপনি এখন প্যাকেজ আছে asyncawait কি হওয়া উচিত একটি খুব ঘনিষ্ঠ সিনট্যাক্স সঙ্গে, ভবিষ্যতে দেশীয় সমর্থন এর await& asyncনোড হবে।

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

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

প্যাকেজ ডক থেকে প্রাথমিক উদাহরণ:

var foo = async (function() {
    var resultA = await (firstAsyncCall());
    var resultB = await (secondAsyncCallUsing(resultA));
    var resultC = await (thirdAsyncCallUsing(resultB));
    return doSomethingWith(resultC);
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.