জাভাস্ক্রিপ্ট কারি: ব্যবহারিক প্রয়োগগুলি কি কি?


172

আমি মনে করি না যে আমি এখনও কারিঙিং করেছি। আমি বুঝতে পারি এটি কী করে এবং কীভাবে এটি করা যায়। আমি কেবল এমন পরিস্থিতিটি ব্যবহার করতে পারি তা ভাবতে পারি না।

আপনি কোথায় জাভাস্ক্রিপ্টে কারিটিং ব্যবহার করছেন (বা এটি ব্যবহার করে মূল গ্রন্থাগারগুলি কোথায়)? DOM হেরফের বা সাধারণ প্রয়োগ উন্নয়নের উদাহরণ স্বাগত।

উত্তরের একটিতে অ্যানিমেশন উল্লেখ করা হয়েছে। মত কাজগুলি slideUp, fadeInএকটি উপাদানকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং সাধারণত একটি ক্রিচ ফাংশন হ'ল অর্ডার ফাংশনটি পূর্বনির্ধারিত "অ্যানিমেশন ফাংশন" অন্তর্নির্মিত সাথে ফিরিয়ে দেয়। কিছু ডিফল্টের সাথে উচ্চ-আপ ফাংশন প্রয়োগ করার চেয়ে কেন এটি আরও ভাল?

এটি ব্যবহারে কোনও ত্রুটি আছে কি?

অনুরোধ অনুসারে এখানে জাভাস্ক্রিপ্ট কারি করার কয়েকটি ভাল সংস্থান রয়েছে:

তারা মন্তব্যগুলিতে ক্রপ হওয়ার সাথে সাথে আরও যুক্ত করব।


সুতরাং, উত্তরগুলি অনুসারে, সাধারণত কারিগরীকরণ এবং আংশিক প্রয়োগ হ'ল সুবিধার কৌশল।

আপনি যদি একই কনফিগারেশনের মাধ্যমে উচ্চ স্তরের ক্রিয়াকলাপটি ঘন ঘন "পরিমার্জন" করে থাকেন তবে সহজ, সংক্ষিপ্ত সহায়ক পদ্ধতি তৈরি করতে আপনি উচ্চ-স্তরের ফাংশনটি কারি (বা রেজিগের আংশিক ব্যবহার) করতে পারেন।


আপনি কি কোনও সংস্থার সাথে একটি লিঙ্ক যুক্ত করতে পারেন যা জেএস কারিরিং কী তা বর্ণনা করে? একটি টিউটোরিয়াল বা একটি ব্লগ পোস্ট দুর্দান্ত হবে।
এরিক শুনোভার

2
svendtofte.com দীর্ঘায়িত তবে আপনি যদি "এমএল-এ একটি ক্রাশ কোর্স" থেকে পুরো বিভাগটি এড়িয়ে যান এবং "কীভাবে তরকারি জাভাস্ক্রিপ্ট লিখবেন" এ আবার শুরু করেন তবে এটি জেএসে কারি করার একটি দুর্দান্ত ভূমিকা হয়ে যায়।
ড্যানিও

1
কারি এবং আংশিক অ্যাপ্লিকেশনটি আসলে কী তা বোঝার জন্য এটি একটি ভাল সূচনার পয়েন্ট
ফাংশনাল- প্রোগ্র্যামিং-

1
লিংক svendtofte.comসৌন্দর্য মৃত হতে - WayBack মেশিনে এটি পাওয়া যদিও এ web.archive.org/web/20130616230053/http://www.svendtofte.com/... দুঃখিত, blog.morrisjohns.com/javascript_closures_for_dummies নিচে হবে বলে মনে হয় খুব
ফটকাট

1
BTW, আংশিক এর Resig এর সংস্করণ ঘাটতি (অবশ্যই নয় "টাকা") হল যে এটি সম্ভবত ব্যর্থ হয়ে যাবে প্রাক ইনিশিয়ালাইজ ( "curried") আর্গুমেন্ট একটি মান দেওয়া হয় অনির্দিষ্ট । ভাল কারিরিং ফাংশনে আগ্রহী যে কোনও ব্যক্তিকে অলিভার স্টিলের ফানসিটোনাল.জেএস থেকে মূলটি পাওয়া উচিত , কারণ এতে সমস্যা নেই।
রবজি

উত্তর:


35

@ হ্যাঙ্ক গে

এম্বেজেনস দ্য মাইন্ডের মন্তব্যের প্রতিক্রিয়া:

আমি জাভাস্ক্রিপ্টে নিজেই কারি করানো দরকারী useful এটি প্রতিটি কলের জন্য একক যুক্তি সহ একাধিক যুক্তিযুক্ত ফাংশন কলগুলিকে ফাংশন কলগুলির চেইনে রূপান্তরিত করার একটি কৌশল, তবে জাভাস্ক্রিপ্ট একক ফাংশন কলে একাধিক যুক্তি সমর্থন করে।

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

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

String.prototype.csv = String.prototype.split.partial(/,\s*/);
var results = "John, Resig, Boston".csv();
alert( (results[1] == "Resig") + " The text values were split properly" );


6
এটি সত্যিই একটি খারাপ উত্তর। আংশিক প্রয়োগের সাথে কারিংয়ের কোনও সম্পর্ক নেই। কারি করা ফাংশন রচনা সক্ষম করে। ফাংশন রচনা ফাংশন পুনরায় ব্যবহার সক্ষম করে। ফাংশনগুলির পুনরায় ব্যবহার কোড রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি করে। এটি এত সহজ!

2
@ ফোর স্যার, আপনি খুব খারাপ উত্তর are কারিঙ করা স্পষ্টতই ফাংশনগুলিকে আরও সুস্বাদু করার বিষয়ে। আপনি স্পষ্টভাবে বিন্দু মিস করেছেন।
কলাত

112

জাভাস্ক্রিপ্টে কারিরিংয়ের একটি আকর্ষণীয় এবং ব্যবহারিক ব্যবহার এখানে ক্লোজার ব্যবহার করে :

function converter(toUnit, factor, offset, input) {
    offset = offset || 0;
    return [((offset + input) * factor).toFixed(2), toUnit].join(" ");
}

var milesToKm = converter.curry('km', 1.60936, undefined);
var poundsToKg = converter.curry('kg', 0.45460, undefined);
var farenheitToCelsius = converter.curry('degrees C', 0.5556, -32);

milesToKm(10);            // returns "16.09 km"
poundsToKg(2.5);          // returns "1.14 kg"
farenheitToCelsius(98);   // returns "36.67 degrees C"

এটি একটি curryএক্সটেনশনের উপর নির্ভর করে Function, যদিও আপনি দেখতে পাচ্ছেন এটি কেবল ব্যবহার করে apply(খুব বেশি অভিনব কিছু নয়):

Function.prototype.curry = function() {
    if (arguments.length < 1) {
        return this; //nothing to curry with - return function
    }
    var __method = this;
    var args = toArray(arguments);
    return function() {
        return __method.apply(this, args.concat([].slice.apply(null, arguments)));
    }
}

5
এটা অসাধারণ! আমি এটি লিস্পের উদ্ধৃতিটির সাথে সমান দেখতে পাই যা বলে যে "লিস্প একটি প্রোগ্রামেবল প্রোগ্রামিং ভাষা"
সান্তিয়াগোবসুল্টো

2
আকর্ষণীয়, কিন্তু এই উদাহরণটি কাজ করে না। আপনার উদাহরণ offset+inputহতে হবে ; ফলাফল । undefined + 1.60936milesToKmNaN
নাথান লং

3
@ নাথান - অফসেটটি অপরিজ্ঞাত করা যায় না - এটি 0 এ ডিফল্ট হয়
অ্যাঙ্গাসস

6
আমি যা পড়েছি (কেবল এখনই), "তরকারী" সাধারণত কোনও ফাংশন ব্যাগের কৌশলগুলির অংশ নয়, যদি না আপনি প্রোটোটাইপ লাইব্রেরি ব্যবহার করেন বা নিজেকে যুক্ত না করেন। যদিও খুব শীতল।
রোবপ্রোগ

11
একইটি ES5 বাইন্ড () পদ্ধতিতে পাওয়া যাবে। বাইন্ড একটি নতুন ফাংশন তৈরি করে যা ডাকা হয় যখন তার প্রথম তর্কটির প্রসঙ্গে এবং যুক্তিগুলির পরবর্তী ক্রম (নতুন ফাংশনে কোনও পাসের পূর্বে) সহ মূল ফাংশনটিকে ডাকে। সুতরাং আপনি করতে পারেন ... var মাইলটোকিম = রূপান্তরকারী.বাইন্ড (এটি, 'কিমি', 1.60936); বা var farenheitToCelsius = রূপান্তরকারী.বাইন্ড (এটি, 'ডিগ্রি সি', 0.5556, -32); প্রথম যুক্তি, প্রসঙ্গ, এটি এখানে অপ্রাসঙ্গিক যাতে আপনি কেবল অপরিজ্ঞাত পাস করতে পারেন। অবশ্যই আপনাকে নন ES5
ফ্যালব্যাকের

7

আমি functools.partialজাভাস্ক্রিপ্টে পাইথনটির মতো আরও কার্যকর যেগুলি দেখতে পেয়েছি তা পেয়েছি :

function partial(fn) {
  return partialWithScope.apply(this,
    Array.prototype.concat.apply([fn, this],
      Array.prototype.slice.call(arguments, 1)));
}

function partialWithScope(fn, scope) {
  var args = Array.prototype.slice.call(arguments, 2);
  return function() {
    return fn.apply(scope, Array.prototype.concat.apply(args, arguments));
  };
}

আপনি এটি ব্যবহার করতে চান কেন? একটি সাধারণ পরিস্থিতি যেখানে আপনি এটি ব্যবহার করতে চান তা হ'ল আপনি যখন thisকোনও ফাংশনে একটি মানকে বাঁধতে চান :

var callback = partialWithScope(Object.function, obj);

এখন যখন কলব্যাক কল করা হবে তখন thisনির্দেশ করুন obj। এটি ইভেন্ট পরিস্থিতিতে বা কিছু স্থান বাঁচাতে দরকারী কারণ এটি সাধারণত কোডকে ছোট করে তোলে।

কারিটিং পার্থক্যটির সাথে আংশিক সমান যা কার্যিংয়ের ফাংশনটি কেবল একটি যুক্তি গ্রহণ করে (যতদূর আমি এটি বুঝতে পারি)।


7

হ্যাঙ্ক গে এর সাথে একমত - এটি নির্দিষ্ট সত্য ক্রিয়ামূলক প্রোগ্রামিং ভাষায় অত্যন্ত কার্যকর - কারণ এটি একটি প্রয়োজনীয় অংশ part উদাহরণস্বরূপ, হাস্কেলে আপনি কেবল কোনও ফাংশনে একাধিক পরামিতি নিতে পারবেন না - খাঁটি ফাংশনাল প্রোগ্রামিংয়ে আপনি এটি করতে পারবেন না। আপনি একবারে একটি পরম নেন এবং আপনার ফাংশনটি তৈরি করেন। জাভাস্ক্রিপ্টে এটি "কনভার্টর" এর মতো স্বীকৃত উদাহরণ সত্ত্বেও কেবল অপ্রয়োজনীয়। কারিরিংয়ের প্রয়োজন ছাড়াই এখানে একই কনভার্টার কোডটি রয়েছে:

var converter = function(ratio, symbol, input) {
    return (input*ratio).toFixed(2) + " " + symbol;
}

var kilosToPoundsRatio = 2.2;
var litersToUKPintsRatio = 1.75;
var litersToUSPintsRatio = 1.98;
var milesToKilometersRatio = 1.62;

converter(kilosToPoundsRatio, "lbs", 4); //8.80 lbs
converter(litersToUKPintsRatio, "imperial pints", 2.4); //4.20 imperial pints
converter(litersToUSPintsRatio, "US pints", 2.4); //4.75 US pints
converter(milesToKilometersRatio, "km", 34); //55.08 km

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

আরও কিছু চিন্তাভাবনার পরে, আমি মনে করি জাভাস্ক্রিপ্টে কারি করার জন্য একটি বৈধ ব্যবহারের কেস রয়েছে: আপনি যদি জাভাস্ক্রিপ্ট ব্যবহার করে খাঁটি ফাংশনাল প্রোগ্রামিং কৌশল ব্যবহার করে লেখার চেষ্টা করছেন। যদিও বিরল ব্যবহারের ক্ষেত্রে মনে হচ্ছে।


2
আপনার কোডটি প্রিজনার জিরোর তুলনায় বোঝা অনেক সহজ এবং এটি কারিগরী বা জটিল কিছু ছাড়াই একই সমস্যার সমাধান করে। আপনি 2 টি থাম্ব আপ পেয়েছেন এবং তার প্রায় 100 রয়েছে Go
DR01D

2

এটি কোনও যাদু বা কিছুই নয় ... বেনাম ফাংশনগুলির জন্য কেবল একটি সুন্দর শর্টহ্যান্ড hand

partial(alert, "FOO!") সমতুল্য function(){alert("FOO!");}

partial(Math.max, 0) অনুরূপ function(x){return Math.max(0, x);}

আংশিক কল ( মোচিকিট পরিভাষা। আমি মনে করি যে অন্য কিছু গ্রন্থাগার ফাংশনগুলিকে একটি .curry পদ্ধতি দেয় যা একই কাজ করে) বেনামি ফাংশনগুলির তুলনায় কিছুটা সুন্দর এবং কম গোলমাল দেখায়।


1

এটি ব্যবহার করে লাইব্রেরি হিসাবে, সবসময় কার্যকরী আছে

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


ধন্যবাদ হ্যাঙ্ক - দয়া করে যখন এটি সাধারণভাবে কার্যকর হয় তখন আপনি বাড়িয়ে দিতে পারেন?
ডেভ নোলান

1

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


কিছু ডিফল্ট হিসাবে কল করার চেয়ে উচ্চতর ফাংশনটি কেন করা ভাল?
ডেভ নোলান

1
কারণ উচ্চতর ফাংশনটি সমর্থন করতে পারে এমন সমস্ত "ডিফল্ট" কল্পনা করার চেয়ে ইচ্ছামত একটি সংযোজন / গুণ / স্কোয়ার / মডুলাস / অন্যান্য-ক্যালকুলেশন সহ "ডোমথঅপ্রেশন" করতে সক্ষম হওয়া এটি আরও বেশি মডুলার।
গ্যাজেট

1

এখানে একটি উদাহরণ।

আমি জিউকিউরির সাথে একগুচ্ছ ক্ষেত্রগুলি প্রস্তুত করছি যাতে আমি দেখতে পাচ্ছি যে ব্যবহারকারীরা কী করছে। কোডটি এর মতো দেখাচ্ছে:

$('#foo').focus(trackActivity);
$('#foo').blur(trackActivity);
$('#bar').focus(trackActivity);
$('#bar').blur(trackActivity);

(নন-জিক্যুয়ারি ব্যবহারকারীদের জন্য, আমি বলছি যে কোনও সময় দুটি ক্ষেত্র ফোকাস পেতে বা হারাতে চাইলে আমি ট্র্যাকএ্যাকটিভিটি () ফাংশনটি কল করতে চাই। আমি একটি বেনামে ফাংশনও ব্যবহার করতে পারি, তবে আমাকে এটির নকল করতে হবে) 4 বার, তাই আমি এটিকে টেনে এনে নাম দিয়েছি))

এখন দেখা যাচ্ছে যে fields ক্ষেত্রগুলির মধ্যে একটির পৃথকভাবে পরিচালনা করা দরকার। আমি আমাদের ট্র্যাকিং অবকাঠামো বরাবর সেই কলগুলির একটিতে একটি প্যারামিটারটি পাস করতে সক্ষম হতে চাই। তরকারি দিয়ে, আমি পারি।


1

অন্যান্য কার্যকরী ভাষায় জাভাস্ক্রিপ্ট ফাংশনগুলিকে লামদা বলা হয়। এটি অন্য বিকাশকারীর সাধারণ ইনপুটটির উপর ভিত্তি করে নতুন এপিআই (আরও শক্তিশালী বা সম্পূর্ণ কার্য) রচনা করতে ব্যবহার করা যেতে পারে। তরকারি একটি কৌশল মাত্র। জটিল এপিআই কল করতে আপনি সরলিকৃত এপিআই তৈরি করতে এটি ব্যবহার করতে পারেন। আপনি যদি সেই বিকাশকারী হন যা সরলিকৃত এপিআই ব্যবহার করেন (উদাহরণস্বরূপ আপনি সহজ ম্যানিপুলেশন করতে jQuery ব্যবহার করেন), আপনার তরকারি ব্যবহার করার দরকার নেই। তবে আপনি যদি সরলীকৃত এপিআই তৈরি করতে চান তবে তরকারি আপনার বন্ধু। আপনাকে একটি জাভাস্ক্রিপ্ট কাঠামো লিখতে হবে (যেমন jQuery, mootools) বা গ্রন্থাগার, তারপরে আপনি এর শক্তির প্রশংসা করতে পারেন। আমি একটি বর্ধিত তরকারী ফাংশন লিখেছি, http://blog.semanticsworks.com/2011/03/enhanced-curry-method.html। কারিরিং করার জন্য আপনার কারি পদ্ধতির দরকার নেই, এটি কেবল তরকারি করতে সহায়তা করে তবে আপনি অন্যায় ফাংশন B () {} ফেরত ফাংশন A () {writing লিখে নিজে নিজেই করতে পারেন can এটি আরও আকর্ষণীয় করে তুলতে, ফাংশন বি () ব্যবহার করুন অন্য ফাংশন সি () ফিরিয়ে আনুন।


1

আমি এটির পুরানো থ্রেডটি জানি কিন্তু এটি দেখানোর জন্য এটি কীভাবে জাভাস্ক্রিপ্ট লাইব্রেরিতে ব্যবহৃত হচ্ছে:

এই ধারণাগুলিগুলিকে দৃ concrete়ভাবে বর্ণনা করতে আমি লড্যাশ.জেএস লাইব্রেরি ব্যবহার করব।

উদাহরণ:

var fn = function(a,b,c){ 
return a+b+c+(this.greet || '); 
}

আংশিক প্রয়োগ:

var partialFnA = _.partial(fn, 1,3);

সংবাহন:

var curriedFn = _.curry(fn);

বাঁধাই:

var boundFn = _.bind(fn,object,1,3 );//object= {greet: ’!'}

ব্যবহার:

curriedFn(1)(3)(5); // gives 9 
or 
curriedFn(1,3)(5); // gives 9 
or 
curriedFn(1)(_,3)(2); //gives 9


partialFnA(5); //gives 9

boundFn(5); //gives 9!

পার্থক্য:

কার্চিংয়ের পরে আমরা কোনও নতুন প্যারামিটার ছাড়াই একটি নতুন ফাংশন পাই।

আংশিক প্রয়োগের পরে আমরা একটি ফাংশন পাই যা কিছু পরামিতিগুলির পূর্ববর্তী সাথে আবদ্ধ।

বাইন্ডিংয়ে আমরা একটি প্রসঙ্গ বাঁধতে পারি যা 'এটি' প্রতিস্থাপন করতে ব্যবহৃত হবে, যদি কোনও ফাংশনের আবদ্ধ না হয় তবে উইন্ডো স্কোপ হবে।

পরামর্শ: চাকা পুনরায় উদ্ভাবনের প্রয়োজন নেই। আংশিক প্রয়োগ / বাঁধাই / তরকারীকরণ খুব সম্পর্কিত related আপনি উপরের পার্থক্যটি দেখতে পাচ্ছেন। এই অর্থটি যে কোনও জায়গায় ব্যবহার করুন এবং লোকেদের বুঝতে হবে যে আপনি কী করছেন তা বোঝার ক্ষেত্রে সমস্যা ছাড়াই আপনাকে কম কোড ব্যবহার করতে হবে।


0

আমি সম্মত হলাম যে আপনি কখনও কখনও সিউডো-ফাংশন তৈরি করে বলটি রোলিং করতে চান যা সর্বদা প্রথম যুক্তিটির ভরাট থাকে Fort ভাগ্যক্রমে, আমি jPaq (এইচ টিটিপি: // নামক একটি ব্র্যান্ড নতুন জাভাস্ক্রিপ্ট লাইব্রেরি জুড়ে এসেছি called jpaq.org/ ) যা এই কার্যকারিতা সরবরাহ করে। লাইব্রেরির সেরা জিনিসটি হ'ল আপনি নিজের বিল্ডটি ডাউনলোড করতে পারেন যা কেবলমাত্র আপনার প্রয়োজনীয় কোডটি ধারণ করে।



0

কেবল ফাংশনাল.জেএস এর জন্য কিছু সংস্থান যুক্ত করতে চেয়েছিলেন:

বক্তৃতা / সম্মেলন কিছু অ্যাপ্লিকেশন ব্যাখ্যা http://www.youtube.com/watch?v=HAcN3JyQoyY

ফাংশনাল.জেএস লাইব্রেরি আপডেট হয়েছে: https://github.com/loop-recur/FunctionalJS কিছু চমৎকার সহায়ক (দুঃখিত এখানে নতুন, কোন খ্যাতি: পি): / লুপ-রিকার / প্রিলেজজেএস

আমি সম্প্রতি একটি জেএস আইআরসি ক্লায়েন্ট সহায়ক সহায়ক লাইব্রেরিতে পুনরাবৃত্তি হ্রাস করতে এই লাইব্রেরিটি অনেকটা ব্যবহার করছি। এটি দুর্দান্ত জিনিস - কোডটি পরিষ্কার করতে এবং সরল করতে সত্যই সহায়তা করে।

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


0

আপনি দ্রুত, এক লাইন সমাধানের জন্য নেটিভ বাইন্ড ব্যবহার করতে পারেন

function clampAngle(min, max, angle) {
    var result, delta;
    delta = max - min;
    result = (angle - min) % delta;
    if (result < 0) {
        result += delta;
    }
    return min + result;
};

var clamp0To360 = clampAngle.bind(null, 0, 360);

console.log(clamp0To360(405)) // 45


0

প্রতিশ্রুতি নিয়ে কাজ করা থেকে শুরু করে এটিতে আরও একটি ছুরিকাঘাত।

(অস্বীকৃতি: জেএস নুব, পাইথন ওয়ার্ল্ড থেকে আগত there এমনকি সেখানে, কারিঙ করা এত বেশি ব্যবহৃত হয় না, তবে এটি উপলক্ষে কার্যকর হতে পারে So

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

এটিকে ব্যর্থ করতে আমি আমার লাইভ ইউআরএল সংশোধন করেছি।

function ajax_batch(e){
    var url = $(e.target).data("url");

    //induce error
    url = "x" + url;

    var promise_details = $.ajax(
        url,
        {
            headers: { Accept : "application/json" },
            // accepts : "application/json",
            beforeSend: function (request) {
                if (!this.crossDomain) {
                    request.setRequestHeader("X-CSRFToken", csrf_token);
                }
        },
        dataType : "json",
        type : "POST"}
    );
    promise_details.then(notify_batch_success, fail_status_specific_to_batch);
}

এখন, এখানে ব্যাচটি ব্যর্থ হয়েছে তা ব্যবহারকারীকে বলতে গেলে, ত্রুটি হ্যান্ডলারের মধ্যে আমার সেই তথ্যটি লিখতে হবে, কারণ এটি সার্ভারের একটি প্রতিক্রিয়া।

কোডিংয়ের সময় আমার কাছে এখনও কেবল তথ্য রয়েছে - আমার ক্ষেত্রে আমার কাছে বেশ কয়েকটি সম্ভাব্য ব্যাচ রয়েছে তবে আমি জানি না যে কোনটি ব্যর্থ ইউআরএল সম্পর্কে সার্ভারের প্রতিক্রিয়াটিকে পার্স করতে ব্যর্থ হয়েছে।

function fail_status_specific_to_batch(d){
    console.log("bad batch run, dude");
    console.log("response.status:" + d.status);
}

চল এটা করি. কনসোল আউটপুট হল:

কনসোল:

bad batch run, dude utility.js (line 109) response.status:404

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

    ... rest is as before...
    var target = $(e.target).text();
    var context = {"user_msg": "bad batch run, dude.  you were calling :" + target};
    var contexted_fail_notification = curry(generic_fail, context); 

    promise_details.then(notify_batch_success, contexted_fail_notification);
}

function generic_fail(context, d){
    console.log(context);
    console.log("response.status:" + d.status);
}

function curry(fn) {
     var slice = Array.prototype.slice,
        stored_args = slice.call(arguments, 1);
     return function () {
        var new_args = slice.call(arguments),
              args = stored_args.concat(new_args);
        return fn.apply(null, args);
     };
}

কনসোল:

Object { user_msg="bad batch run, dude. you were calling :Run ACL now"} utility.js (line 117) response.status:404 utility.js (line 118)

আরও সাধারণভাবে, জেএসে কলের ব্যাকব্যাকের ব্যবহার কতটা বিস্তৃত তা প্রদত্ত, কারিগরি করা বেশ কার্যকর সরঞ্জাম বলে মনে হচ্ছে।

https://javascriptweblog.wordpress.com/2010/04/05/curry-cooking-up-tastier-funifications/ http://www.drdobbs.com/open-source/currying-and-partial-funitions-in- javasc / 231001821? pgno = 2

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