जावास्क्रिप्ट करी: व्यावहारिक अनुप्रयोग क्या हैं?


172

मुझे नहीं लगता कि मैंने अभी तक करीने से कताई की है। मैं समझता हूं कि यह क्या करता है, और यह कैसे करना है। मैं अभी ऐसी स्थिति के बारे में नहीं सोच सकता कि मैं इसका उपयोग करूं।

आप जावास्क्रिप्ट का उपयोग कहां कर रहे हैं (या इसका उपयोग करने वाले मुख्य पुस्तकालय कहां हैं)? डीओएम हेरफेर या सामान्य अनुप्रयोग विकास उदाहरण स्वागत करते हैं।

एक उत्तर में एनीमेशन का उल्लेख है। फ़ंक्शंस जैसे slideUp, fadeInएक तत्व को एक तर्क के रूप में लेते हैं और आम तौर पर एक क्यूरेड फ़ंक्शन होते हैं जो डिफ़ॉल्ट "एनीमेशन फ़ंक्शन" के साथ उच्च क्रम फ़ंक्शन को वापस करते हैं। क्यों सिर्फ कुछ चूक के साथ उच्च-समारोह को लागू करने से बेहतर है?

क्या इसका उपयोग करने में कोई कमियां हैं?

जैसा कि यहाँ अनुरोध किया गया है कि जावास्क्रिप्ट पर कुछ अच्छे संसाधन हैं:

मैं और अधिक जोड़ दूंगा क्योंकि वे टिप्पणियों में फसल लेते हैं।


तो, जवाब के अनुसार, सामान्य रूप से करी और आंशिक अनुप्रयोग सुविधा तकनीक हैं।

यदि आप अक्सर एक ही कॉन्फ़िगरेशन के साथ कॉल करके एक उच्च-स्तरीय फ़ंक्शन को "परिष्कृत" कर रहे हैं, तो आप सरल, संक्षिप्त सहायक विधियों को बनाने के लिए उच्च-स्तरीय फ़ंक्शन को करी (या उपयोग कर सकते हैं)।


क्या आप एक संसाधन के लिए एक लिंक जोड़ सकते हैं जो बताता है कि जेएस करी क्या है? एक ट्यूटोरियल या एक ब्लॉग पोस्ट बहुत अच्छा होगा।
एरिक शूनओवर

2
svendtofte.com लंबी है, लेकिन यदि आप "एमएल में क्रैश कोर्स" से पूरे सेक्शन को छोड़ देते हैं और फिर से "क्यूरेड जावास्क्रिप्ट कैसे लिखें" पर शुरू करते हैं, तो यह js में करी करने के लिए एक शानदार परिचय बन जाता है।
डैनियो

1
यह समझने के लिए कि करी और आंशिक अनुप्रयोग वास्तव में क्या है, एक अच्छा प्रारंभिक बिंदु है: slid.es/gsklee/functional-programming-in-5-minutes
gsklee

1
के लिए लिंक svendtofte.comदिखता मृत होने का - वेबैक मशीन पर यह पाया हालांकि पर web.archive.org/web/20130616230053/http://www.svendtofte.com/... क्षमा करें, blog.morrisjohns.com/javascript_closures_for_dummies बंद हो गया है भी
फाटकैट ३०'१४ को १४:१५

1
BTW, रेसिग का संस्करण आंशिक रूप से कमजोर है (निश्चित रूप से "पैसे पर नहीं") इसमें यह संभवतया विफल हो जाएगा यदि पूर्व-प्रारंभिक ("करी") तर्कों में से एक को अपरिभाषित मान दिया जाता है । किसी को भी एक अच्छे करीने के कार्य में रुचि रखने वाले को ओलिवर स्टील के funcitonal.js से मूल प्राप्त करना चाहिए , क्योंकि इसमें वह समस्या नहीं है।
22

जवाबों:


35

@ हंक गे

EmbiggensTheMind की टिप्पणी के जवाब में:

मैं एक ऐसे उदाहरण के बारे में नहीं सोच सकता जहाँ करीने से — स्वयं जावास्क्रिप्ट में उपयोगी हो; यह फ़ंक्शन कॉल को कई तर्कों के साथ फ़ंक्शन कॉल को प्रत्येक कॉल के लिए एक तर्क के साथ कनवर्ट करने के लिए एक तकनीक है, लेकिन जावास्क्रिप्ट एकल फ़ंक्शन कॉल में कई तर्कों का समर्थन करता है।

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

आप उन ज्ञात मूल्यों को ठीक करने के लिए आंशिक अनुप्रयोग / करी का उपयोग कर सकते हैं और एक फ़ंक्शन वापस कर सकते हैं जो केवल अज्ञात को स्वीकार करता है, बाद में आमंत्रित किया जा सकता है जब आपके पास वास्तव में वे मान होते हैं जो आप पास करना चाहते हैं। यह अपने आप को दोहराने से बचने के लिए एक निफ़्टी तरीका प्रदान करता है जब आप एक ही जावास्क्रिप्ट बिल्ट-इन और सभी समान मूल्यों के साथ एक से अधिक कॉल कर रहे होंगे। जॉन का उदाहरण चुराने के लिए:

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
@ आफ़्टर सर, आप बहुत खराब जवाब हैं। करी स्पष्ट रूप से कार्यों को अधिक स्वादिष्ट बनाने के बारे में है। आपने स्पष्ट रूप से बात को याद किया।
सितंबर को

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
यह भी खूब रही! मैं इसे लिस्प उद्धरण के समान देखता हूं जो कहता है कि "लिस्प एक प्रोग्राम करने योग्य प्रोग्रामिंग भाषा है"
santiagobasulto

2
दिलचस्प है, लेकिन यह उदाहरण काम नहीं करता है। आपके उदाहरण में offset+inputहोगा ; उस में परिणाम है । undefined + 1.60936milesToKmNaN
नाथन लॉन्ग

3
@Nathan - ऑफसेट अपरिभाषित नहीं किया जा सकता है - यह डिफ़ॉल्ट रूप में 0
AngusC

6
जब से मैंने (अभी-अभी) पढ़ा है, "करी" आम तौर पर फ़ंक्शन के ट्रिक्स बैग का हिस्सा नहीं होता है, जब तक कि आप प्रोटोटाइप लाइब्रेरी का उपयोग नहीं कर रहे हैं या इसे स्वयं नहीं जोड़ते हैं। हालांकि, बहुत अच्छा है।
रोबोप्रोग

11
उसी को ES5 बाइंड () विधि से प्राप्त किया जा सकता है। बिंद एक नया फ़ंक्शन बनाता है जिसे मूल फ़ंक्शन को उसके पहले तर्क के संदर्भ में और तर्कों के बाद के अनुक्रम के साथ कॉल किया जाता है (पूर्व में किसी भी नए फ़ंक्शन को पारित किया गया)। तो आप कर सकते हैं ... var miToKm = converter.bind (यह, 'किमी', 1.60936); या var farenheitToC सेल्सियस = Converter.bind (यह, 'डिग्री C', 0.5556, -32); पहला तर्क, संदर्भ, यह यहाँ अप्रासंगिक है इसलिए आप अपरिभाषित पारित कर सकते हैं। बेशक आपको गैर
ईएस 5

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

हांक गे से सहमत होना - यह कुछ वास्तविक कार्यात्मक प्रोग्रामिंग भाषाओं में बेहद उपयोगी है - क्योंकि यह एक आवश्यक हिस्सा है। उदाहरण के लिए, हास्केल में आप केवल एक फ़ंक्शन के लिए कई पैरामीटर नहीं ले सकते हैं - आप शुद्ध कार्यात्मक प्रोग्रामिंग में ऐसा नहीं कर सकते। आप एक बार में एक परम लेते हैं और अपने कार्य का निर्माण करते हैं। जावास्क्रिप्ट में, यह केवल अनावश्यक है, "कनवर्टर" जैसे आकस्मिक उदाहरणों के बावजूद। यहां वही कनवर्टर कोड है, जो करीने की आवश्यकता के बिना है:

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 हैं। जाओ आंकड़ा।
4:01 बजे DR01D

2

यह कोई जादू या कुछ भी नहीं है ... अनाम कार्यों के लिए सिर्फ एक सुखद आशुलिपि।

partial(alert, "FOO!") के बराबर है function(){alert("FOO!");}

partial(Math.max, 0) से मेल खाती है function(x){return Math.max(0, x);}

आंशिक ( MochiKit शब्दावली) के लिए कॉल । मुझे लगता है कि कुछ अन्य पुस्तकालय कार्यों को एक .curry विधि देते हैं जो समान कार्य करता है) अनाम कार्यों की तुलना में थोड़ा अच्छा और कम शोर दिखता है।


1

पुस्तकालयों का उपयोग करने के लिए, वहाँ हमेशा कार्यात्मक है

जेएस में यह कब उपयोगी है? संभवतः उसी समय यह अन्य आधुनिक भाषाओं में उपयोगी है, लेकिन केवल एक बार मैं इसका उपयोग करके खुद को देख सकता हूं जो आंशिक अनुप्रयोग के साथ है।


धन्यवाद हांक - जब आप सामान्य रूप से उपयोगी होते हैं, तो क्या आप इसका विस्तार कर सकते हैं?
डेव नोलन

1

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


केवल कुछ चूक के साथ कॉल करने के बजाय हूपअप फ़ंक्शन को क्युरी करना बेहतर है?
डेव नोलन

1
क्योंकि यह बहुत अधिक मॉड्यूलर है कि "doMathOperation" को जोड़ने में सक्षम होने के लिए एक अतिरिक्त / गुणन / वर्ग / मापांक / अन्य-कैलिडेस के साथ सभी "डिफ़ॉल्ट" की कल्पना करना चाहते हैं जो उच्च फ़ंक्शन का समर्थन कर सकता है।
gizmo

1

यहाँ एक उदाहरण है।

मैं JQuery के साथ खेतों का एक समूह बना रहा हूं ताकि मैं देख सकूं कि उपयोगकर्ता क्या कर रहे हैं। कोड इस तरह दिखता है:

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

(गैर-JQuery उपयोगकर्ताओं के लिए, मैं कह रहा हूं कि किसी भी समय कुछ फ़ील्ड्स फ़ोकस हो जाते हैं या फ़ोकस हो जाते हैं, मैं चाहता हूं कि ट्रैकअक्टिविटी () फ़ंक्शन को कॉल किया जाए। मैं एक अनाम फ़ंक्शन का भी उपयोग कर सकता हूं, लेकिन मुझे इसे डुप्लिकेट करना होगा। 4 बार, इसलिए मैंने इसे बाहर निकाला और इसका नाम दिया।)

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


1

जावास्क्रिप्ट कार्यों को अन्य कार्यात्मक भाषा में लैम्डा कहा जाता है। इसका उपयोग किसी अन्य डेवलपर के सरल इनपुट के आधार पर एक नया एपीआई (अधिक शक्तिशाली या कंप्लेक्स फ़ंक्शन) बनाने के लिए किया जा सकता है। करी सिर्फ तकनीकों में से एक है। आप एक जटिल एपीआई को कॉल करने के लिए एक सरलीकृत एपीआई बनाने के लिए इसका उपयोग कर सकते हैं। यदि आप सरल एफी का उपयोग करने वाले हिरन हैं (उदाहरण के लिए आप सरल हेरफेर करने के लिए jQuery का उपयोग करते हैं), तो आपको करी का उपयोग करने की आवश्यकता नहीं है। लेकिन अगर आप सरलीकृत एपीआई बनाना चाहते हैं, तो करी आपकी दोस्त है। आपको एक जावास्क्रिप्ट फ्रेमवर्क लिखना होगा (जैसे jQuery, mootools) या लाइब्रेरी, फिर आप इसकी शक्ति की सराहना कर सकते हैं। मैं एक बढ़ाया करी समारोह में लिखा था http://blog.semanticsworks.com/2011/03/enhanced-curry-bethod.html। करी करने के लिए आपको करी विधि की आवश्यकता नहीं है, यह सिर्फ करी करने में मदद करता है, लेकिन आप हमेशा इसे एक फ़ंक्शन A () {} से दूसरे फ़ंक्शन B () {} को वापस करने के लिए मैन्युअल रूप से लिख सकते हैं। इसे और अधिक रोचक बनाने के लिए, फ़ंक्शन B () का उपयोग करके दूसरे फ़ंक्शन C () को वापस करें।


1

मैं इसके पुराने धागे को जानता हूं लेकिन मुझे यह दिखाना होगा कि इसका उपयोग जावास्क्रिप्ट लाइब्रेरी में कैसे किया जा रहा है:

मैं इन अवधारणाओं का संक्षिप्त वर्णन करने के लिए lodash.js लाइब्रेरी का उपयोग करूंगा।

उदाहरण:

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

आंशिक आवेदन:

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

Currying:

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!

अंतर:

करीने के बाद हमें कोई नया फ़ंक्शन मिलता है जिसमें कोई पैरामीटर नहीं होता है।

आंशिक आवेदन के बाद हमें एक फ़ंक्शन मिलता है जो कुछ मापदंडों के साथ पूर्वगामी होता है।

बंधन में हम एक संदर्भ को बांध सकते हैं जिसका उपयोग 'इसे' को बदलने के लिए किया जाएगा, यदि किसी फ़ंक्शन के बाध्य डिफ़ॉल्ट विंडो गुंजाइश नहीं होगी।

सलाह: पहिया को सुदृढ़ करने की कोई आवश्यकता नहीं है। आंशिक आवेदन / बाध्यकारी / करी बहुत संबंधित हैं। आप ऊपर का अंतर देख सकते हैं। कहीं भी इस अर्थ का उपयोग करें और लोग पहचान लेंगे कि आप मुद्दों को समझने के बिना क्या कर रहे हैं और आपको कम कोड का उपयोग करना होगा।


0

मैं इस बात से सहमत हूं कि कई बार आप एक छद्म कार्य बनाकर गेंद को लुढ़काना चाहेंगे, जिसमें हमेशा भरे हुए पहले तर्क का मूल्य होगा। सौभाग्य से, मैं jPaq (h ttp: //) नामक एक बिल्कुल नई जावास्क्रिप्ट लाइब्रेरी में आया था। jpaq.org/ ) जो यह कार्यक्षमता प्रदान करता है। पुस्तकालय के बारे में सबसे अच्छी बात यह है कि आप अपना स्वयं का निर्माण डाउनलोड कर सकते हैं जिसमें केवल वही कोड होता है जिसकी आपको आवश्यकता होगी।



0

बस Functional.js के लिए कुछ संसाधन जोड़ना चाहते थे:

कुछ अनुप्रयोगों की व्याख्या करने वाला व्याख्यान / सम्मेलन http://www.youtube.com/watch?v=HAcN3JyQoyY

Updated Functional.js लाइब्रेरी: https://github.com/loop-recur/FunctionalJS कुछ अच्छे मददगार (क्षमा करें यहां नया, कोई प्रतिष्ठा नहीं: p): / loop-recur / PreludeJS

मैं इस पुस्तकालय का उपयोग हाल ही में एक आईआर आईआरसी क्लाइंट हेल्पर लाइब्रेरी में दोहराव को कम करने के लिए कर रहा हूं। यह बहुत अच्छा है - वास्तव में कोड को साफ और सरल बनाने में मदद करता है।

इसके अलावा, यदि प्रदर्शन एक मुद्दा बन जाता है (लेकिन यह परिवाद काफी हल्का है), तो एक देशी फ़ंक्शन का उपयोग करके इसे फिर से लिखना आसान है।


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

एक और छुरा, वादों के साथ काम करने से।

(अस्वीकरण: जेएस नोब , पायथन दुनिया से आ रहा है। वहां भी, करी का उपयोग सभी के लिए बहुत अधिक नहीं किया जाता है, लेकिन यह अवसर पर काम में आ सकता है। इसलिए मैंने करी फ़ंक्शन को देखा - लिंक देखें)

सबसे पहले, मैं एक अजाक्स कॉल के साथ शुरू कर रहा हूं। मेरे पास सफलता के लिए कुछ विशिष्ट संसाधन हैं, लेकिन असफलता पर, मैं केवल उपयोगकर्ता को यह प्रतिक्रिया देना चाहता हूं कि कुछ कॉल करने से कुछ त्रुटि हुई । अपने वास्तविक कोड में, मैं एक बूटस्ट्रैप पैनल में त्रुटि प्रतिक्रिया प्रदर्शित करता हूं, लेकिन मैं यहां लॉगिंग का उपयोग कर रहा हूं।

मैंने इसे विफल बनाने के लिए अपने लाइव url को संशोधित किया है।

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

अब, चलो परिवर्तन चीज़ें थोड़ी एक है कि कर रहा है और एक पुन: प्रयोज्य सामान्य विफलता हैंडलर का उपयोग, लेकिन यह भी curried दोनों साथ में जाना जाता है-पर-कोड-टाइम संदर्भ और क्रम की जानकारी घटना से उपलब्ध बुला रनटाइम पर।

    ... 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-functions/ http://www.drdobbs.com/open-source/currying-and-partial-functions-in-in javasc / 231001821? pgno = 2

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